下面是我的代码的一个示例
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()中的SIGCHLD,这就是为什么system总是返回-1。
但让我更困惑的是: SIGCHLD在默认情况下不是被忽略了吗?那么,为什么忽略SIGCHLD会导致这种情况呢?
有人能给我解释一下吗?
感谢@cnicutar现在我理解忽略SIGCHLD的效果。
但是,现在我想知道,在忽略SIGCHLD时,有什么方法可以获得子进程的返回值吗?还是因为POSIX规范和操作系统的实现,这是不可能的?
发布于 2014-07-30 14:35:25
但让我更困惑的是: SIGCHLD在默认情况下不是被忽略了吗?
不,默认情况下它不会被忽略。默认情况下,根本没有处理程序,也没有采取任何操作。
那么,为什么忽略SIGCHLD会导致这种情况呢?
无视有一个有趣的副作用:儿童不会变成僵尸。
POSIX.1-2001指定,如果将SIGCHLD的处理设置为SIG_IGN,或者为SIGCHLD设置了SA_NOCLDWAIT标志(请参见sigaction(2)),则终止的子程序不会变成僵尸,对
wait()或waitpid()的调用将被阻塞,直到所有子节点终止为止,然后失败,并将errno设置为ECHILD。
也就是说,你不需要再等孩子,因为他们是自动收集的。但system(3)希望有个孩子!因此,waitpid返回一个错误,system(3)行为。
https://stackoverflow.com/questions/25039369
复制相似问题