exit函数使用说明

摘要:本文描述的是Linux手册页(3.73版本)中exit()函数的使用说明,使用exit()函数正常终止一个进程.原文来自:http://www.kernel.org/doc/man-pages/.
NAME
    exit - 正常终止一个程序
SYNOPSIS
    #include <stdlib.h>
    void exit(int status);
DESCRIPTION
    exit()函数用于正常终止一个进程,参数status&0377作为终止状态,返回给父进程.
    调用exit函数时,通过函数atexit或on_exit注册的所有函数(终止处理程序)都会被调用,且调用的顺序刚好与注册时候的顺序相反.(在这些终止处理程序中有可能是为了在程序终止时执行一个额外的处理.新注册的函数会被添加到注册队列的头部,然后等待被调用.)如果这些终止处理程序没有返回退出(比如:_exit函数或kill a signal),那么剩余的终止处理程序将不会被调用.exit函数也将被抛弃终止.如果同一个函数如若注册多次,则也会被调用多次.
    调用exit函数后,所有的IO流都会被关闭,由tmpfile创建的文件也会被移除.
    在C标准中设定了两个常量,EXIT_SUCCESS和EXIT_FAILURE,用来作为exit函数的参数,分别指出进程是正常退出还是异常终止.
RETURN VALUE
    exit函数没有返回值.
ATTRIBUTES
  多线程
    函数exit使用了一个不受保护的全局变量,所以它不是安全的线程.
CONFORMING TO
       SVr4, 4.3BSD, POSIX.1-2001, C89, C99.
NOTES
    如果终止处理函数调用了exit或longjmp函数,那发生的后果将是无法预知的.注意,调用execve函数将移除所有终止处理程序.
    相对于0和非0值,用EXIT_SUCCESS和EXIT_FAILURE更加简易明.特别的,VMS采用了不同的规定.
    BSD尝试将exit函数规范化.
    调用exit函数,退出进程后,终止状态必须要传递给父进程.这时,会发生三种情况:如果父进程设置了SA_NOCLDWAIT标志位(SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程.)    或者是将信号SIGCHLD交给SIG_IGN处理(当一个进程正常或异常终止时,内核就向父进程发送SIGCHLD信号,如果父进程不处理,交给SIG_IGN,则相当于父进程忽略子进程的生死.)子进程的终止状态会被抛弃.如果父进程正在等待取得子进程结束的终止状态.在这两种情况下,子进程将会马上终止,释放资源.如果一个已经终止,但父进程尚未对其进行善后处理的进程,被称之为僵死进程(进程已经终止,但是还没释放所占用的资源).所以父进程可以通过调用wait函数来等待处理退出的子进程.
    如果系统支持信号机制,可以通过信号传递给父进程,但是如果父进程设置了SA_NOCLDWAIT标志位,父进程将无法收到信号.
    如果进程是回话首进程且控制着一个控制终端,该进程终止后,该回话组的所有进程都会收到一个SIGHUP信号,同时终端也将会被释放,这些进程或终端可以加入到别的进程组.
    如果退出进程使得该组其他进程成为孤儿进程,这些孤儿进程将会终止,同时会接收到由信号处理程序SIGCONT发来的SIGHUP信号.
END

笔者:个人能力有限,只是学习参考...读者若发现文中错误,敬请提出.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章