【发布时间】:2016-11-05 15:35:31
【问题描述】:
比如在父进程中,我fork了一个子进程,等待子进程:
int main() {
setSignal(SIGCHLD, sigchld_handler)
while(1) {
// fork some child processes
myForkFunction()
waitpid(-1, &status, 0)
}
}
此外,我还有一个 SIGCHLD 信号处理程序:
void
sigchld_handler(int sig) {
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
// Reap zombie processes
}
}
可以看出,waitpid() 出现在main() 函数和sigchld_handler() 函数中。我想知道waitpid 是否可以被SIGCHLD 打断。如果它可以被SIGCHLD打断,那会发生什么?
有人对此有任何想法吗?
【问题讨论】:
-
您为什么使用
WUNTRACED而不是0或WNOHANG?WUNTRACED是一个非常特殊的条件 - POSIXwaitpid()说:WUNTRACED 由 pid 指定的任何已停止的子进程的状态,并且自停止后尚未报告其状态,也应报告给请求进程。(我在第一次阅读时错过了一个“也”,但即便如此,搞乱停止/跟踪的进程是不寻常的。) -
是的,
WUNTRACED很奇怪,可能不是 OP 想要的... -
@JonathanLeffler 是的,你是对的。谢谢!
-
你修错了。你应该把它改成
WNOHANG(不是0)。0如果您有一个尚未完成的孩子,将导致您的信号处理程序阻塞。
标签: c linux unix signals system-calls