在unix的SIGINT信号由内核发送给用户进程,而此时正在执行有sigint触发的信号处理程序,那么此信号会被阻塞。
如果仅此而已,unix可以正确处理。但若此时又有一个sigint信号被投送到此用户进程,那么这个信号会被简单的丢弃,并不会排队。
在编写信号处理程序的时候通常容易忽略这点:
常见的错误是这样的:
会输出如下结果:
wuyichao@wuyichao-desktop:~/workspace/u_n_p/signal$ ./wait
Hello from child 22896
Hello from child 22897
Hello from child 22898
Handler reaped child 22896
.........
Handler reaped child 22897
.........
^C
wuyichao@wuyichao-desktop:~/workspace/u_n_p/signal$ ./wait
Hello from child 22902
Hello from child 22903
Hello from child 22904
Handler reaped child 22902
.........
@通常的处理的方法,如<深入理解计算机系统>中代码p514
输出结果:
关键的地方:while ((pid = waitpid(-1, NULL, 0)) > 0)
printf("Handler reaped child %d/n", (int)pid);
不让父进程几次进入信号处理程序。父进程就第一次进入信号程序,就陷在里面,直到while 结束
理解waitpid();