man exit _exit

来源:互联网 发布:sql通配符的使用 编辑:程序博客网 时间:2024/06/05 02:19

英语水平低于一般人之下,不达供参水平。


1 _exit(2) –Linux man page

名字

_exit, _Exit  – 终止当前运行的进程


纲要

#include  <unistd.h>

void  _exit(int status);

#include  <stdlib.h>

void  _Exit(int status);

描述

_exit()函数即刻终止当前运行的进程。属于当前进程的任何打开的文件描述符都会被关闭。如果此进程有子进程,则此进程变为init进程,此进程会像父进程发送一个SIGCHLD信号。


status的值被返回给父进程,作为当前进程的退出状态。父进程调用wait(2)函数能够获取子进程退出的退出状态。


_Exit()等效于_exit()。


返回值

函数无返回值。


注意

关于进程退出的影响,像传送给父进程的值status,僵尸进程,信号传送等可参考exit(3)函数。


_exit()函数就像exit(),但前者不会用atexit(3)或者on_exit(3)来调用任何函数注册。_exit(3)是否会刷新I/O缓冲区,是否会删除由tmpfile(3)创建的临时文件依赖具体的实现。另一方面,_exit()会关闭文件描述符,这就可能引起一个输出的延迟。如果要去掉这样的延迟,那么可以在调用_exit()之前调用tcflush(3)函数。当调用_exit()时,是不是每一个被挂起的I/O都会被取消,哪一个挂起的I/O可能会被取消都要看具体的实现。


glibc 2.3版本及以下,_exit()函数的封装会调用与之同名的系统调用。2.3版本以上,此函数会调用exit_group(2),以终止此进程中的所有线程


2 exit(3) –Linux man page

名字

exit – 引起一个正规的进程终止


纲要

#include <stdlib.h>

void exit(int status);

描述

exit()函数能引起一个正规进程退出并向父进程返回status& 0377值。


通过调用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()或者longjmp(3)用atexit(3)和on_exit(3)来注册函数时并没有定义会发生什么样的情况。注意调用execve(2)函数时将移除atexit(3)和on_exit(3)创建的注册。


EXIT_SUCCESS和EXIT_FAILURE相对于0和非0(1,-1)要更方便(对于非UNIX环境来说)。尤其是,VMS用一个不同的转换。

BSD尝试着去标准化退出代码,见<sysexits.h>.


调用exit()后,退出状态会传递给父进程。这里有三种情况:当父进程设置了SA_NOCLDWAIT,SIGCHLD或SIG_IGN,这个状态会被丢弃。如果父进程在等子进程,父进程被通知了其退出状态。在这两种情况下,退出进程会立马终止。如果父进程并不关心子进程的退出状态,也没有等待子进程的退出状态,子进程就成为了僵尸进程。所以,父进程可以通过调用wait(2)函数来了解子进程的退出状态。


如果实现支持SIGCHLD信号,这个信号将被送到父进程。如果父进程设置了SA_NOCLDWAIT,当SIGCHLD信号被送到时没有定义应作出何处理。


如果进程是session的首个进程,并且它的控制终端就是session的控制终端,那么在这个控制终端下的每个在前台的进程组将会发送一个SIGHUP信号,终端与session就会失去关联,允许新的控制进程访问此控制终端。


如果一个进程的退出引起了一个进程组变成了孤儿组,如果任何新的孤儿进程组被停止,那么SIGHUP信号将会被SIGCONT信号跟随着发送到此进程组中的每一个进程。见setpgid(2)作为学习孤儿进程组的扩展。


[2014.09.25 -- 20:52]

TNote Over.

0 0
原创粉丝点击