exit函数用法详解
exit函数简介
- 头文件包含
#include <stdlib.h>
- 函数定义
void exit(int status );
exit函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <stdlib.h>
exit函数详细描述
exit ()函数导致正常进程终止,并且status的最低有效字节(即status & 0xFF)返回给父进程(参见wait (2))
所有向atexit (3)和on_exit (3)注册的函数都被调用,其注册顺序与它们相反。(这些函数中的一个可以使用atexit (3)或on_exit (3)来注册要在退出处理期间执行的附加函数;新的注册被添加到要调用的函数列表的前面。)如果这些函数中的一个没有返回(例如,它调用_exit (2)或用信号杀死自己),那么其余的函数都不会被调用,并且进一步的退出处理(特别是刷新stdio (3)流)被放弃。如果一个函数已经使用atexit (3)或on_exit (3)注册了多次,那么它被调用的次数和它被注册的次数一样多。
所有打开的stdio (3)流都被刷新和关闭。tmpfile (3)创建的文件将被删除。
C标准指定了两个常数EXIT_SUCCESS和EXIT_FAILURE,它们可以传递给exit (),分别指示成功或不成功的终止。
exit函数返回值
exit ()函数不返回。
exit函数其他说明
如果使用atexit (3)和on_exit (3)注册的函数之一调用exit ()或longjmp (3),则行为未定义。注意,对execve (2)的调用会删除使用atexit (3)和on_exit (3)创建的注册
使用 EXIT_SUCCESS 和 EXIT_FAILURE 比使用0和一些非零值(如1或-1)更易于移植(对于非UNIX环境)。特别是,VMS使用不同的约定。
BSD试图标准化退出代码(一些C库如GNU C库也采用了这一点);请参阅文件
在exit ()之后,退出状态必须传输到父进程。有三种情况:
- 如果父级设置了SA_NOCLDWAIT 或将 SIGCHLD 处理程序设置为SIG_IGN ,则状态被丢弃,子级立即死亡。
- 如果父母正在等待孩子,它会被通知退出状态,孩子会立即死亡。
- 否则,子进程就变成了一个“僵尸”进程:大部分进程资源被回收,但是包含关于子进程的最少信息(终止状态、资源使用统计)的槽被保留在进程表中。这允许父母随后使用waitpid (2)(或类似的)来了解孩子的终止状态;此时,僵尸进程槽被释放。
如果实现支持 SIGCHLD 信号,则该信号被发送到父级。如果父级设置了SA_NOCLDWAIT ,则不确定是否发送 SIGCHLD 信号。Signals sent to other processes如果退出进程是会话领导者,并且其控制终端是该会话的控制终端,则向该控制终端的前台进程组中的每个进程发送 SIGHUP 信号,并且该终端与该会话断开关联,允许它被新的控制进程获取。
如果进程的退出导致进程组成为孤立的,并且如果新孤立的进程组的任何成员被停止,则 SIGHUP 信号后跟 SIGCONT 信号将被发送到该进程组中的每个进程。有关孤立进程组的解释,请参见setpgid (2)。
除了在上述情况下,其中被信令的进程可能是终止进程的子进程,进程的终止通常会not导致信号被发送到该进程的子进程。但是,进程可以使用prctl (2) PR_SET_PDEATHSIG 操作来安排它在其父进程终止时接收信号。
评论区