1、遗留问题
僵死进程及其解决代码
在之前我们实现了用 wait 解决僵死进程的问题,但是调用 wait 也就是等待子进程的结束,它遗留的问题是wait本身会阻塞,等待事件发生,本身会挂起,直到有一个任意子进程退出,然后才会执行父进程。
2、利用信号
(1)利用信号实现子进程结束会给父进程发送信号SIGCHLD,当父进程接收到信号时,再调用wait,这样父进程就不会阻塞
(2)但是我们如何知道父进程哪些代码能够保证在收到信号之后执行?
给信号绑定一个信号处理函数,信号处理函数收到信号才会被调用。
3、实现代码
void fun(int sign)
{
pid_t = 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 staring: %d\n",getpid());
sleep(10);
printf("child over\n");
}
else
{
pid_t id = wait(NULL);
printf("id = %d\n",id);
printf("father staring\n");
sleep(20);
printf("father over\n");
}
exit(0);
}