假如应用C/C 语言表达在UNIX或Linux系统软件下程序编写,会碰到许多过程撤出相关函数的状况。有些是C标准库给予的涵数,有些是系统进程,有些是系统进程或是某一系统软件特有的涵数,名称十分类似,给人一种应接不暇的觉得。

文中尝试汇总普遍的系统进程解析函数,并根据一个事例展现基本上使用方法。

过程撤出一系列系统进程/涵数。

_exit

_exit(2)是一个POSIX系统进程,适用UNIX和Linux系统软件。启用这一系统进程会造成当今过程立即撤出,涵数不容易回到。核心会关掉这一过程开启的文件描述符,假如有子过程,便会被1号过程选用,随后向该过程的父过程推送SIGCHLD数据信号。

作用原形如下所示:

#include noreturn void _exit(int status);

主要参数目录

–“情况”:过程撤出编码。

传参

无传参

exit_group

Exit_group(2)是Linux系统软件独特的系统进程,会造成过程的全部进程撤出。因为glibc 2.3,_exit事实上是exit_group系统进程的包裝器。因而,他们在Linux系统软件上是等额的的。

作用原形如下所示:

#include void exit_group(int status);

主要参数目录

–“情况”:过程撤出编码。

传参

无传参

_Exit

_Exit(3)是一个c标准库涵数,作用上等同于C99引进的_Exit系统进程。由于是标准库给予的作用,在混合开发可移植性上比_exit更强,因此提议先用。

作用原形如下所示:

#include void _Exit(int status);

主要参数目录

–“情况”:过程撤出编码。

传参

无传参

exit

Exit(3)是一个C规范函数库,也是最常见的过程撤出涵数。它与_exit和_Exit的相同之处取决于,除开使过程撤出的关键作用(还可以在启用_exit系统进程来完成)以外,它还实行一些预实际操作:

逐一实行新用户注册的自定清除涵数(根据 atexit 或是 on_exit 涵数申请注册)更新规范I/O流缓冲区域并关掉删掉由规范函数库 tmpfile 建立的临时文件

作用原形如下所示:

#include noreturn void exit(int status);

主要参数目录

–“情况”:过程撤出编码。

传参

无传参

atexit

Atexit(3)是一个c标准库涵数,用以申请注册过程撤出清除涵数。该作用在运用时有下列常见问题:

清除涵数的实行程序与申请注册次序反过来。当过程接到致命性数据信号时,申请注册的清除涵数不容易强制执行。当过程启用 _exit(或是 _Exit)时,申请注册的清除涵数不容易强制执行。当实行到某一清除涵数时,若接到致命性数据信号或是清除涵数内启用了 _exit(或是 _Exit),那麼该清除涵数不容易回到而且事后的其他清除涵数也会被丢掉。当同一个清除涵数被申请注册数次,那麼一切正常状况时该清除涵数也会强制执行相对应的频次。父过程在启用 fork 前申请注册了清除涵数,那麼这种清除涵数也会褥子过程所承继;若子过程事后又启用了 exec 系列产品涵数,那麼子过程所赠予的清除涵数则会被清除。单独过程可以申请注册的清除涵数的总数不容易低于32个。

作用原形如下所示:

#include int atexit(void (*function)(void));

主要参数目录

–` function `:客户界定的过程撤出清除作用。

传参

取得成功回到0,0之间的值表明不成功。

on_exit

该涵数类似atexit涵数,也有on_exit(3)涵数。它是Linux系统软件下独有的作用,用以申请注册过程撤出清除作用。与atexit涵数不一样,它适用额外主要参数。

作用原形如下所示:

#include int on_exit(void (*function)(int, void *), void *arg);

主要参数目录

–` function `:客户界定的过程撤出清除作用。

–` arg `:种类为` void * '的自定主要参数。

传参

取得成功回到0,0之间的值表明不成功。

事例

#include #include #include #include void cleanup1() { fprintf(stderr, "[1]cleanup\n"); sleep(1);}void cleanup2() { fprintf(stderr, "[2]cleanup\n"); sleep(1);}void cleanup3(int status, void *arg) { fprintf(stderr, "[3]cleanup: %s\n", (char *)arg); sleep(1);}int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s exit|_exit|_Exit|return\n", argv[0]); return EXIT_FAILURE; } // atexit申请注册自定清除涵数 atexit(cleanup1); atexit(cleanup2); atexit(cleanup2); // 数次申请注册同一个涵数 // 非标涵数on_exit,仅Linux下合理 // on_exit(cleanup3, (void *)"bye!!!"); // on_exit(cleanup3, (void *)"bye!!!"); // 数次申请注册同一个涵数 fprintf(stdout, "a newline!\n"); // 向stdout载入带回车符的字符串数组(行缓存,碰到回车符的情形下便会启用write系统进程輸出內容) fprintf(stderr, "[stderr]a newline!"); // 向stderr载入没有回车符的字符串数组(stderr默认设置状况下无缓存,立即启用write系统进程) fprintf(stdout, "[stdout]forgot a newline!"); // 向stdout载入没有回车符的字符串数组(若不更新缓冲区域,则这家银行內容不容易被輸出) if (strcmp("exit", argv[1]) == 0) { // 功效:实行一些内置的清除实际操作并停止当今过程 // 规范函数库(C89) // #include // 启用exit涵数会实行下列实际操作: // 1.启用新用户注册的清除涵数 // 2.更新缓冲区域并关掉全部规范IO流 // 3.删掉临时文件夹 // 4.启用_exit系统进程 exit(0); } else if (strcmp("_Exit", argv[1]) == 0) { // 功效:立即停止当今过程(含过程的全部进程) // 规范函数库(C99) // #include // 实际效果相当于_exit,但可移植性更强。 _Exit(0); } else if (strcmp("_exit", argv[1]) == 0) { // 功效:立即停止当今过程(含过程的全部进程) // 是对exit_group系统进程的包裝(可撤出全部进程) // #include _exit(0); } return EXIT_SUCCESS; // main函数return会启用exit涵数}

评论(0条)

刀客源码 游客评论