下面是我的代码示例
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/