我没有在我的代码中处理SIGCHLD。终止后,我的流程仍然立即删除。我希望它成为僵尸进程。如果我将SIGCHLD设置为SIGDFT,那么它会起作用吗?如何将SIGCHLD设置为SIGDFT?我希望进程变成僵尸,所以我可以在waitpid之后读取父进程中的子状态。
答案 0 :(得分:6)
从您的问题历史中,您似乎将自己与此结合在一起。以下是有关其工作原理的概述:
SIGCHLD的默认处置是忽略。换句话说,如果您不执行任何操作,则会忽略信号,但僵尸存在于进程表中。这就是为什么你可以在孩子死后随时wait
就可以了。
如果你设置了一个信号处理程序,那么信号就会被传递出来,你可以在适当时收获它,但是(前)孩子在它死亡和收获它之间仍然是一个僵尸。
如果您手动通过signal
将SIGCHLD的处置设置为SIG_IGN,则语义与第1项中的语义略有不同。当您手动设置此处置时,操作系统立即生效当子进程死亡时将其从进程表中删除,并且不创建一个僵尸。因此,不再有任何状态信息需要收获,wait
将因ECHILD而失败。 (2.6.9之后的Linux内核遵循这种行为。)
答案 1 :(得分:0)
所以你的最终目标是在子进程退出后读取父进程中的返回码?我没有看到这有任何问题。一些示例代码是:
short pid;
if((pid == fork()) == 0) {
// Child process do some thing here.
exit(n);
} else {
int returnCode;
while(pid != wait(&returnCode));
// the child has terminated with returnCode
// wait is blocking system call so u don't need to worry about busy waiting.
}