在Linux上,在阅读
SIGCHLDwith
之前终止的多个子代
signalfd()将被压缩为单个
SIGCHLD。这意味着,当您读取
SIGCHLD信号时,必须在 所有
终止的子级之后进行清理:
// Do this after you've read() a SIGCHLD from the signalfd file descriptor:while (1) { int status; pid_t pid = waitpid(-1, &status, WNOHANG); if (pid <= 0) { break; } // something happened with child 'pid', do something about it... // Details are in 'status', see waitpid() manpage}我应该注意,实际上两个子处理程序同时终止时,我已经看到了这种信号压缩。如果我只做一次
waitpid(),那么终止的孩子之一将不会得到处理。并且上面的循环修复了它。
相应的文档:
- http://man7.org/linux/man-pages/man7/signal.7.html “相比之下,如果在当前阻塞标准信号的情况下交付了多个标准信号实例,则只有一个实例排队”
- http://man7.org/linux/man-pages/man3/sigwait.3p.html “如果在调用sigwait()之前存在多个单个信号编号的挂起实例,则是否实现取决于实现定义返回该信号号的剩余未决信号。”



