以下是我的代码
的示例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规范和操作系统实现,这是不可能的?
答案 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)
会表现出来。