下面是我的代码示例

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。在这种情况下,我无法获得命令的实际返回值。
有人说ignore sigchld会影响waitpid()中的system(),这就是为什么system总是返回-1。
但更让我困惑的是:sigchld不是默认被忽略了吗?那么为什么显式地忽略sigchld会导致这种情况呢?
有人能给我解释一下吗?
多亏了@cnicutar,我现在明白了忽略sigchld的后果。
但现在我想知道是否有任何方法可以在忽略sigchld时获取子进程的返回值?或者这是由于posix规范和os实现而不可能实现的吗?

最佳答案

但更让我困惑的是:sigchld不是默认被忽略了吗?
不,默认情况下不会被忽略。默认情况下,根本没有处理程序,也不会执行任何操作。
那么为什么显式地忽略sigchld会导致这种情况呢?
忽略SIGCHLD有一个有趣的副作用:孩子不会变成僵尸。
posix.1-2001指定如果sigchld的disposition设置为
为sigchld设置sig ign或sa_nocldwait标志(请参见
sigaction(2)),则终止的子级不会成为僵尸和
调用wait()waitpid()将阻塞,直到所有子级
已终止,然后失败,并将errno设置为echild。
也就是说,你不需要再等孩子了,因为他们是自动收集的。但是应该有个孩子!因此system(3)返回一个错误并且waitpid行为。

关于c - 忽略SIGCHLD的system()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25039369/

10-13 09:32