2014-04-15 172 views
2

我没有在我的代码中处理SIGCHLD。终止后,我的流程仍会立即被删除。我希望它成为僵尸程序。如果我将SIGCHLD设置为SIGDFT,那么它会起作用吗?我如何将SIGCHLD设置为SIGDFT?我想要进程成为僵尸,所以我可以在waitpid之后读取父进程中的子进程。什么是信号(SIGCHLD,SIG_DFL);意思?

+0

你应该始终* *阅读与儿童状况'尤其是waitpid'当你安装了'SIGCHLD'处理器(或没有它)。阅读[signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html),[signal(2)](http://man7.org/linux/man- pages/man2/signal.2.html),[sigaction(2)](http://man7.org/linux/man-pages/man2/sigaction.2.html)。 –

+0

waitpid返回-1与errno = ECHILD。所以孩子的状态是无效的,只有一些垃圾。 – kapilddit

回答

5

从你的问题记录,你似乎被捆绑在自己在这个结。下面是它如何工作的概要:

  1. SIGCHLD的默认处置是忽略。换句话说,如果你什么都不做,信号被忽略,但僵尸存在于进程表中。这就是为什么你可以在孩子死后的任何时候在wait上。

  2. 如果您设置了一个信号处理程序,那么信号就会被传送,您可以根据需要收割它,但(之前的)孩子在死亡和收获之间仍然是僵尸。

  3. 如果手动集SIGCHLD的性格通过signal SIG_IGN那么语义是比他们在项目1.当您手动设置此配置的操作系统将立即从进程表中的孩子,当它死有一点不同和不是创建一个僵尸。因此,不再有任何状态信息收获,并且wait将因ECHILD而失败。 (Linux内核2.6.9后坚持这种行为。)

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. 
} 
+0

是的,这里我总是从等待中获得-1(返回值)。我希望从等待中获得孩子的pid作为回报值。所以我可以继续处理孩子的状况。这不是在我的情况发生..当我检查errno它是ECHILD。那么如何检查SIGCHLD标志? – kapilddit

+0

请参阅[链接](http://stackoverflow.com/questions/14266485/understanding-sigchld-when-the-child-process-terminates)使用处理程序绑定信号,看看发生了什么。 – qqibrow