子进程的异步等待
来源:互联网 发布:对数据分析的理解 编辑:程序博客网 时间:2024/06/05 09:02
父进程在创建子进程时,会调用wait或waitpid清理僵尸进程。
#include<sys/types.h>#include<sys/wait.h>
等待函数1:
pid_t wait(int*status);
返回值:成功返回被等待进程pid,失败返回-1。
参数: 输出型参数,获取⼦进程退出状态,不关⼼则可以设置成为NULL
等待函数2:
pid_t waitpid(pid_t pid, int *status, int options);
返回值:
1. 当正常返回的时候waitpid返回收集到的⼦进程的进程ID;
2. 如果设置了选项WNOHANG,⽽调⽤中waitpid发现没有已退出的⼦进程可收集,则返回0;
3. 如果调⽤中出错,则返回-1,这时errno会被设置成相应的值以指⽰错误所在;
4. 当pid所指⽰的⼦进程不存在,或此进程存在,但不是调⽤进程的⼦进程,waitpid就会出错返回,这时errno被设置为ECHILD.
参数:
1. pid:
Pid=-1,等待任⼀个⼦进程。与wait等效。
Pid>0.等待其进程ID与pid相等的⼦进程。
Pid==0等待其组ID等于调⽤进程组ID的任⼀个⼦进程。
Pid<-1等待其组ID等于pid绝对值的任⼀⼦进程。
2. status:
WIFEXITED(status) : 若为正常终⽌⼦进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status) : 若WIFEXITED⾮零,提取⼦进程退出码。(查看进程的退出码)
3. options:
WNOHANG :若pid指定的⼦进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该⼦进程的ID。
SIGCHLD信号
一般情况下,子进程终止时会给父进程发送SIGCHLD信号,父进程对该信号的默认处理动作为忽略。我们可以自定义SIGCHLD信号的处理函数,父进程就可以执行自己的操作,不必关心子进程,子进程只需在结束时给父进程发送信号,父进程处理信号即可。
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h> #include<sys/wait.h>#include<signal.h>void hander(int sig){ printf("get a sig: %d,pid: %d\n",sig,getpid());}int main(){ signal(SIGCHLD,hander);//catch SIGCHLD(17) pid_t id=fork();//create child process if(id == 0) {//child printf("i am child,quit!my pid is %d\n",getpid()); exit(1); } else {//father printf("i am father\n"); waitpid(id,NULL,0);//wait child } return 0;}
由结果可以看出,子进程结束时给父进程发送信号,而父进程现在处理该信号的函数已经为自定义的函数。
- 子进程的异步等待
- 子进程的异步等待
- 子进程异步等待
- 子进程的异步等待方式
- SIGCHLD--子进程的异步等待
- 子进程的异步等待方式
- Linux子进程的异步等待方式
- Linux----子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 子进程的异步等待方式
- 南阳理工acm151Biorhythms(中国剩余定理)
- 机房重构-主窗体
- MTK feature phone 射频参数配置
- 字符串与字符串模板
- 关于Spring的69个面试问答——终极列表
- 子进程的异步等待
- SQLite主键自增
- UIButton常用
- c注释向c++注释的转换
- [leetcode]301. Remove Invalid Parentheses
- 77868676798687JUHUIHUIG
- 《用户体验》 --- 读书笔记
- bat批处理加密打开文件夹
- BZOJ4443(Scoi2015)[小凸玩矩阵]--二分+二分图最大匹配