我没有SIGCHLD
在我的代码中处理。终止后我的进程仍然被立即删除。我希望它成为僵尸进程。
如果我设置SIGCHLD
到SIG_DFL
那时,它会工作吗?我该如何SIGCHLD
设置SIG_DFL
?
我想让进程变成僵尸,所以我可以在waitpid
.
我没有SIGCHLD
在我的代码中处理。终止后我的进程仍然被立即删除。我希望它成为僵尸进程。
如果我设置SIGCHLD
到SIG_DFL
那时,它会工作吗?我该如何SIGCHLD
设置SIG_DFL
?
我想让进程变成僵尸,所以我可以在waitpid
.
从您的问题历史来看,您似乎对此束手无策。以下是其工作原理的概要:
SIGCHLD 的默认处置是忽略。换句话说,如果你什么都不做,信号会被忽略,但进程表中存在僵尸。这就是为什么您可以wait
在孩子死后随时使用它。
如果你设置了一个信号处理程序,那么信号就会被传递,你可以适当地收获它,但是(前)孩子在它死去和你收获它之间仍然是一个僵尸。
如果您手动将 SIGCHLD 的处置设置为 SIG_IGN,signal
则语义与第 1 项中的有所不同。当您手动设置此处置时,操作系统会在子进程死亡时立即从进程表中删除并且不会创建僵尸。因此,不再有任何状态信息可以获取,并且wait
将因 ECHILD 失败。(2.6.9 之后的 Linux 内核坚持这种行为。)
所以你的最终目标是在子进程退出后读取父进程中的返回码?我不认为这与信号有任何关系。一些示例代码是:
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.
}