exit函数:C/C++ 中 exit() 函数 2024-03-29 16:36:17 0 0 【知乎上的问题】C/C++ 中 exit() 函数的参数到底有什么意义? C 语言的设计之初就是为 Unix 系统设计的,而这个系统是『很多程序互相配合』搭配成一个系统。 每个运行着的程序都是进程,而进程就会有父进程,父进程通常是直接启动你的进程,父进程死亡的进程会被 init 收养,其父进程变为 init,而 init 的父进程是进程 0,进程 0 则是系统启动时启动的第一个进程。 exit() 里面的参数,是传递给其父进程的。对父进程来说,你的进程仿佛是一个函数,而函数可以有返回值。 所以回答第一个问题:exit() 的参数,是给自己的父进程使用的。通常一个程序的父进程可能是任何进程,因此我们无法预期我们的父进程是否规定必须要有这个返回值,那么我们应当提供这个返回值,以保证不同的父进程的需求得到满足。 一个典型的例子是 make,Makefile 对于一个 target 下面有多条顺序执行的语句,而 make 作为父进程,会检查每个语句的返回值是否为 0 ,遇到任何一个非 0 值,都会停止当前 rule 的执行。而我们知道,make 实际上可以执行任何命令任何程序,因而任何被 make 调用的程序必须有正确的返回值。 另外一个问题,为什么要使用 exit() 函数? 答:是历史原因,虽然现在大多数平台下,直接在 main() 函数里面 return 可以退出程序。但是在某些平台下,在 main() 函数里面 return 会导致程序永远不退出(因为代码已经执行完毕,程序却还没有收到要退出的指令)。换句话说,为了兼容性考虑,在特定的平台下,程序最后一行必须使用 exit() 才能正常退出,这是 exit() 存在的重要价值。 【转自specialping】C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值.. exit(1)表示进程正常退出. 返回 1; exit(0)表示进程非正常退出. 返回 0. 进程环境与进程控制(1): 进程的开始与终止 1. 进程的开始: C程序是从main函数开始执行, 原型如下: int main(int argc, char *argv[]); 通常main的返回值是int型, 正确返回0. 如果main的返回值为void或者无, 某些编译器会给出警告, 此时main的返回值通常是0. 关于main的命令行参数不做过多解释, 以下面的程序展示一下: #i nclude <stdio.h> int main(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) printf("argv[%d]: %s\n", i, argv[i]); return 0; } 2. 进程终止: C程序的终止分为两种: 正常终止和异常终止. 正常终止分为: return, exit, _exit, _Exit, pthreade_exit 异常中指分为: abort, SIGNAL, 线程响应取消 主要说一下正常终止的前4种, 即exit系列函数. #i nclude <stdlib.h> /* ISO C */ void exit(int status); void _Exit(int status); #i nclude <unistd.h> /* POSIX */ void _exit(int status); 以上3个函数的区别是: exit()(或return 0)会调用终止处理程序和用户空间的标准I/O清理程序(如fclose), _exit和_Exit不调用而直接由内核接管进行清 理. 因此, 在main函数中exit(0)等价于return 0. 3. atexit终止处理程序: ISO C规定, 一个进程最对可登记32个终止处理函数, 这些函数由exit按登记相反的顺序自动调用. 如果同一函数登记多次, 也会被 调用多次. 原型如下: #i nclude <stdlib.h> int atexit(void (*func)(void)); 其中参数是一个函数指针, 指向终止处理函数, 该函数无参无返回值. 以下面的程序为例: #i nclude <stdlib.h> static void myexit1() { printf("first exit handler\n"); } static void myexit2() { printf("second exit handler\n"); } int main() { if (atexit(my_exit2) != 0) printf("can't register my_exit2\n"); if (atexit(my_exit1) != 0) printf("can't register my_exit1\n"); if (atexit(my_exit1) != 0) printf("can't register my_exit1\n"); printf("main is done\n"); return 0; } 运行结果: $ ./a.out main is done first exit handler first exit handler second exit handler运行结果: $./a.out arg1 arg2 arg3 argv[0]: ./a.out argv[1]: arg1 argv[2]: arg2 argv[3]: arg3 收藏(0)