EXIT - Linux手册页

时间:2019-08-20 18:00:14  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-02-09

名称

exit-导致正常进程终止

语法

#include <stdlib.h>

void exit(int status);

说明

exit()函数会导致正常进程终止,并且状态的最低有效字节(即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()函数不会返回。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
exit()Thread safetyMT-Unsafe race:exit

exit()函数使用不受保护的全局变量,因此它不是线程安全的。

遵循规范

POSIX.1-2001,POSIX.1-2008,C89,C99,SVr4、4.3BSD。

备注

如果使用atexit(3)和on_exit(3)注册的函数之一调用exit()或longjmp(3),则该行为未定义。请注意,对execve(2)的调用将删除使用atexit(3)和on_exit(3)创建的注册。

(对于非UNIX环境)使用EXIT_SUCCESS和EXIT_FAILURE比使用0和一些非零值(例如1或-1)更便于移植。特别是,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)。

除上述情况外,如果发信号的进程可能是终止进程的子进程,则进程的终止通常不会导致将信号发送到该进程的子进程。但是,进程可以使用prctl(2)PR_SET_PDEATHSIG操作来安排它的父进程终止时接收到信号。

另外参见

_exit(2),get_robust_list(2),setpgid(2),wait(2),atexit(3),on_exit(3),tmpfile(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/