博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
exit,_exit,wait,waitpid
阅读量:4879 次
发布时间:2019-06-11

本文共 1788 字,大约阅读时间需要 5 分钟。

目录


1.exit()和_exit()

进程一般有两种退出方式,一种是异常终止,如调用abort(),另一种是使用exit()和_exit()系统调用正常终止。![](https://images2018.cnblogs.com/blog/1435096/201807/1435096-20180722223435245-1566831687.png)由上图片可知,exit与_exit区别:1)exit会执行调用退出处理程序2)exit会执行清除I/O缓存接下来分别对于上述两个区别加以分析。

①区别一

首先,说一下退出处理程序产生的原因:以一个应用程序库为例,如果进程使用了该程序库,那么在进程终止前该库需要执行一些清理操作,由于库本身无法要求在进程退出前调用库中特定的清理函数,所以可以使用退出处理程序。退出处理程序是由程序员设计的函数,在进程调用exit()函数正常终止时自动执行。可以使用atexit()函数注册退出处理程序。终止处理程序的调用与注册次序相反。
int atexit(void (*function)(void))
返回值 若成功则为0,若出错则为非零
void bye1(void){    printf("bye1...do\n");}void bye2(void){    printf("bye2...do\n");}int main(){    atexit(bye1);    atexit(bye2);    printf("hello....");    exit(0);}

②区别二

int main(void){    printf("hello。。。");    //exit(0);          fflush(stdout);   //fflush(NULL);    _exit(0);       //若没有fflush,打印不出东西}

2.wait和waitpid

当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)。子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程使用wait/waitpid查询子进程的退出状态。
pid_t wait(int *status)
参数 状态信息
返回值 若成功则为子进程的ID,若出错则为-1
wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。
pid_t waitpid(pid_t pid, int *status,int options)
作用 用来等待某个特定进程的结束
返回值 若成功则为子进程的ID,若出错则为-1
参数
pid pid == -1:等待任一子进程
pid > 0:等待其进程ID与pid相等的子进程
pid == 0: 等待与调用者进程同在一个组的进程
pid < -1: 等待其组ID等于pid的绝对值的任一子进程
status 状态信息
options 改变waitpid的行为,WNOHANG:防止waitpid把调用者的执行挂起

3.小demo

void TestFunc(int loopnum){    printf("loopnum:%d\n", loopnum);}int main(void ){    int procnum = 10;    int loopnum = 100;    int i = 0, j = 0;    printf("please enter you procNum : \n");    scanf("%d", &procnum);    printf("please enter you loopnum :\n");    scanf("%d", &loopnum);    pid_t pid;    for (i=0; i
0) { ; } printf("hello...\n"); return 0;}

以上演示了父进程能监控所有子进程的退出,避免僵尸进程。

转载于:https://www.cnblogs.com/EngineerZhang/p/9351785.html

你可能感兴趣的文章
record for json formate site
查看>>
get 和 post 请求的区别(转)
查看>>
查询树形的根节点
查看>>
HDU 1272 小希的迷宫
查看>>
利用WPS 2012/2013 0day针对中国政府部门的定向攻击
查看>>
hdu 5412 CRB and Queries(整体二分)
查看>>
linux程序目录
查看>>
Socket ABAP (转)
查看>>
[C#]SharpDevelop---窗体设计器
查看>>
调试wcf服务端口号自动变化的解决办法
查看>>
VM 启动时报错:Failed to lock the file
查看>>
js中forEach与for循环小结
查看>>
160308_Signals & Slots
查看>>
Centos出现-bash: unzip: command not found的解决办法
查看>>
UVA 1025 A Spy in the Metro - 简单dp
查看>>
根据进程号(PID)查找进程的所在目录
查看>>
vue项目引用 iView 组件——全局安装与按需加载
查看>>
读书笔记五
查看>>
mysql 表级锁
查看>>
iotop使用
查看>>