system()函数,而SIGCHLD被忽略

时间:2014-07-30 14:24:06

标签: c linux unix signals child-process

以下是我的代码

的示例
signal(SIGCHLD, SIG_IGN);

ret = system("ls -al");

if(ret < 0)
{
    perror("system failed");
    printf("return value is %d\n", ret);
}

ls -al命令可以毫无问题地执行。

system()的返回值始终为-1。在这种情况下,我无法获得命令的实际返回值。

有些参考文献表示忽略SIGCHLD会影响waitpid()中的system(),这就是system始终返回-1的原因。

但令我更困惑的是:默认情况下,SIGLLD是否被忽略?那么为什么明确地忽略SIGCHLD会导致这种情况?

有人可以向我解释一下吗?

感谢@cnicutar,我了解忽略SIGCHLD的影响。

但现在我想知道是否有任何方法可以在忽略SIGCHLD时获得子进程的返回值?或者由于POSIX规范和操作系统实现,这是不可能的?

1 个答案:

答案 0 :(得分:4)

  

但更令我困惑的是:默认情况下不会忽略SIGCHLD吗?

不,默认情况下不会被忽略。默认情况下,根本没有处理程序,也没有采取任何操作。

  

那么为什么明确地忽略SIGCHLD会导致这种情况?

忽略SIGCHLD有一个有趣的副作用:孩子不会变成僵尸

  

POSIX.1-2001指定如果SIGCHLD的处置设置为   为SIGCHLD设置SIG_IGN或SA_NOCLDWAIT标志(参见   sigaction(2)),然后终止的孩子不会成为僵尸和   致wait()waitpid()的电话会阻止所有儿童   已终止,然后将errno设置为ECHILD失败。

也就是说,您不需要再为孩子等待,因为他们会自动收集。但是system(3)期待一个孩子!因此waitpid会返回错误,system(3)会表现出来。

相关问题