【发布时间】:2021-09-27 21:05:12
【问题描述】:
这是我的代码示例
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 会影响system() 中的waitpid(),这就是为什么system 总是返回-1。
但更让我困惑的是:SIGCHLD 不是默认忽略的吗?那么为什么显式忽略 SIGCHLD 会导致这种情况呢?
谁能给我解释一下?
感谢@cnicutar,我现在了解忽略 SIGCHLD 的影响。
但是现在我想知道是否有任何方法可以在忽略 SIGCHLD 的情况下获取子进程的返回值?还是由于 POSIX 规范和操作系统实现,这是不可能的?
【问题讨论】:
-
您可能会发现其中一个或两个很有用——它们都有相同的程序作为我的答案的一部分:Do I need to do anything with a SIGCHLD handler if I am just using
wait()to wait for one child at a time? 和 Linux — sleep of parent process interrupted by child process。 -
否:当您说您不关心子进程的退出状态时,没有(标准)方法可以获取子进程的退出状态,这就是您所做的当您将
SIGCHLD的信号处理设置为SIG_IGN。
标签: c linux unix signals child-process