在之前我们通过在父进程中直接调用wait方法,会使父进程阻塞,等待子进程结束 ,来解决僵死进程的问题;现在我们可以利用信号来解决僵死进程的问题,下面我们就来看一下利用信号解决僵死进程的方法。
利用信号解决僵死进程:
子进程结束会给父进程发送信号SIGCHLD,当父进程收到SIGCHLD信号时,再调用wait方法;这样父进程在没有收到信号的时候可以做自己的事情,不会阻塞。
父进程哪些代码能够保证是收到信号之后执行的:
给SIGCHLD信号绑定一个信号处理函数(此函数会在收到SIGCHLD信号之后才会被调用)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
#include<signal.h>
viod fun(int sign)
{
pid_t pid=wait(NULL);
printf("fun:pid=%d\n",pid);
}
int main()
{
signal(SIGCHLD,fun);
pid_t pid=fork();
assert(pid !=-1 );
if(pid==0)
{
printf("child start\n");
sleep(5);
printf("child end\n");
}
else
{
printf("father start\n");
sleep(10);
printf("father end\n");
}
}