POSIX 信号处理
信号:
1、由一个进程发送给另一个进程。
2、由内核发送给某个进程。
如SIGCHLD信号就是由内核在任何一个进程终止时,发送给该进程的父进程。
每个信号有一个与之关联的处置,或称为行为(action)(信号处理函数)。可以通过sigaction函数设置信号的行为。
1)设置信号处理函数
这种行为称为捕获信号。但是有两个信号不能被捕获:SIGKILL SIGSTOP 。 信号处理函数的原型为:
void handler(int signo);
2)将信号的处置设定为SIG_IGN来忽略该信号。SIGKILL SIGSTOP不能被忽略。
3)把某个信号的处置设定为SIG_DFL来启动它的默认处置。默认处置通常为:在收到信号后终止进程,其中某些喜好还在当前
工作目录产生一个进程的核心映像(core dump)
当fork一个进程,但是没有wait时,那么会产生僵死进程。
书上的练习代码:https://github.com/huntinux/unpvol1/tree/master/5chp
注意 wait和waitpid的区别。
当有5个进程同时终止,但是SIGCHLD的处理函数只执行一次的话,还是会产生僵死进程!
v3文件夹的代码使用wait,就会产生这样的错误。
所以正确的代码是循环调用waitpid来处理的!