而SIGCHLD系统()函数被忽略(system() function while

2019-10-20 14: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会影响waitpid()system()这就是为什么system总是返回-1。

但令我百思不解的更多的是:不SIGCHLD默认被忽略掉? 那么,为什么忽略SIGCHLD明确会导致这种情况?

可能有人给我讲解一下?

由于现在@cnicutar我明白忽略SIGCHLD的影响。

但现在我想知道有没有什么方法来获得子进程的返回值,而SIGCHLD被忽略? 或者这只是不可能的,因为POSIX规范和OS realizaiton?

Answer 1:

但令我百思不解的更多的是:不SIGCHLD默认被忽略掉?

不,默认情况下它不会被忽略。 默认情况下,根本没有处理程序,并没有采取行动。

那么,为什么忽略SIGCHLD明确会导致这种情况?

忽略SIGCHLD有一个有趣的副作用:孩子不成为僵尸

POSIX.1-2001指定如果SIGCHLD的配置设置为SIG_IGN或SA_NOCLDWAIT标志设置为SIGCHLD(见的sigaction(2)),然后终止的孩子不变成僵尸和一个呼叫wait()waitpid()将阻塞,直到所有的孩子已经终止,再失败,并将errno设置为ECHILD。

也就是说,你不必再等待了儿童,因为他们得到自动收集。 但是system(3)预期的孩子! 所以waitpid返回一个错误, system(3)行为。



文章来源: system() function while SIGCHLD is ignored