子进程的异步等待

来源:互联网 发布:对数据分析的理解 编辑:程序博客网 时间: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;}      

这里写图片描述
由结果可以看出,子进程结束时给父进程发送信号,而父进程现在处理该信号的函数已经为自定义的函数。

原创粉丝点击