EXIT(3)

NAME
exit - 使程序正常中止

SYNOPSIS 总览
#include <stdlib.h>

void exit(int status);

DESCRIPTION 描述
函数 exit() 使得程序正常中止，status & 0377 的值被返回给父进程 (参见 wait(2)) 。所有用 atexit() 和 on_exit() 注册的函数都以与注册时相反的顺序被依次执行。使用 tmpfile() 创建的文件被删除。

C 标准定义了两个值 EXIT_SUCCESS 和 EXIT_FAILURE，可以作为 exit() 的参数，来分别指示是否为成功退出。

RETURN VALUE 返回值
函数 exit() 不会返回。

CONFORMING TO 标准参考
SVID 3, POSIX, BSD 4.3, ISO 9899 (``ANSI C'')

NOTES 要点
在 exit 处理过程中，可能会使用 atexit() 和 on_exit() 注册其他的函数。通常，最后注册的函数被从已注册函数链中摘下来，然后执行。如果在处理过程中，又调用了 exit() 或 longjmp()，那么发生的行为是未定义的。

相对于使用 0 和非零值 1 或 -1，使用 EXIT_SUCCESS 和 EXIT_FAILURE 可以稍微增加一些可移植性 (对非 Unix 环境)。特别的，VMS 使用一种不同的约定。

BSD 试图标准化退出代码 - 参见文件 <sysexits.h> 。

exit() 之后，退出状态必须传递给父进程。这里有三种情况。如果父进程已设置了 SA_NOCLDWAIT，或者已将 SIGCHLD 的处理句柄设置成了 SIG_IGN，这个状态将被忽略。这时要退出的进程立即消亡。如果父进程没有表示它对退出状态不感兴趣，仅仅是不再等待，那么要退出的程序变成一个僵尸进程 (``zombie''，除了包含一个字节的退出状态外，什么也不是)。这样在父进程后来调用 wait() 函数族之一时，可以得到退出状态。

如果所用实现支持 SIGCHLD 信号，信号将被发送到父进程。如果父进程已设置了 SA_NOCLDWAIT，它被取消定义。(?)

如果进程是一个 session leader，它的控制终端是会话的控制终端，那么这个终端的前台进程组的每个进程都将收到 SIGHUP 信号；终端将与这个会话断开，可以再被一个新的控制进程获得。

如果进程的退出使得一个进程组成为孤儿，并且这个新近成为孤儿的进程组中任何的进程被中止，进程组中所有的进程将依次收到 SIGHUP 和 SIGCONT 信号。

SEE ALSO 参见
_exit(2), wait(2), atexit(3), on_exit(3), tmpfile(3)