Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略SIGCHLD时的system()函数_C_Linux_Unix_Signals_Child Process - Fatal编程技术网

忽略SIGCHLD时的system()函数

忽略SIGCHLD时的system()函数,c,linux,unix,signals,child-process,C,Linux,Unix,Signals,Child Process,下面是我的一段代码示例 signal(SIGCHLD, SIG_IGN); ret = system("ls -al"); if(ret < 0) { perror("system failed"); printf("return value is %d\n", ret); } 信号(SIGCHLD,SIG_IGN); ret=系统(“ls-al”); 如果(ret

下面是我的一段代码示例

signal(SIGCHLD, SIG_IGN);

ret = system("ls -al");

if(ret < 0)
{
    perror("system failed");
    printf("return value is %d\n", ret);
}
信号(SIGCHLD,SIG_IGN);
ret=系统(“ls-al”);
如果(ret<0)
{
perror(“系统故障”);
printf(“返回值为%d\n”,ret);
}
可以毫无问题地执行
ls-al
命令

但是
system()
的返回值总是-1。在这种情况下,我无法获得命令的实际返回值

一些参考称,ignore SIGCHLD会影响
system()
中的
waitpid()
,这就是
system
总是返回-1的原因

但更让我困惑的是:SIGCHLD不是默认被忽略了吗?那么为什么显式忽略SIGCHLD会导致这种情况呢

有人能给我解释一下吗

感谢@cnicutar,现在我了解了忽略SIGCHLD的影响

但现在我想知道,在忽略SIGCHLD的情况下,是否有任何方法可以获取子进程的返回值?或者这是因为POSIX规范和操作系统的实现而不可能的

但更让我困惑的是:SIGCHLD不是默认被忽略了吗

不,默认情况下不会忽略它。默认情况下,没有处理程序,也没有执行任何操作

那么为什么显式忽略SIGCHLD会导致这种情况呢

忽略
SIGCHLD
有一个有趣的副作用:儿童不会变成僵尸

POSIX.1-2001规定,如果SIGCHLD的处置设置为 为SIGCHLD设置SIG_IGN或SAU NOCLDWAIT标志(请参阅 sigaction(2)),则终止的子对象不会变成僵尸,并且 对
wait()
waitpid()
的调用将被阻止,直到所有子级 已终止,然后在errno设置为ECHILD时失败

也就是说,您不需要再等待孩子,因为他们会自动收集。但是
system(3)
期望有个孩子!因此,
waitpid
返回一个错误,系统(3)运行

但更让我困惑的是:SIGCHLD不是默认被忽略了吗

不,默认情况下不会忽略它。默认情况下,没有处理程序,也没有执行任何操作

那么为什么显式忽略SIGCHLD会导致这种情况呢

忽略
SIGCHLD
有一个有趣的副作用:儿童不会变成僵尸

POSIX.1-2001规定,如果SIGCHLD的处置设置为 为SIGCHLD设置SIG_IGN或SAU NOCLDWAIT标志(请参阅 sigaction(2)),则终止的子对象不会变成僵尸,并且 对
wait()
waitpid()
的调用将被阻止,直到所有子级 已终止,然后在errno设置为ECHILD时失败


也就是说,您不需要再等待孩子,因为他们会自动收集。但是
system(3)
期望有个孩子!因此
waitpid
返回一个错误,并且
system(3)
正常工作。

谢谢!那么,在忽略SIGCHLD时,是否有可能获取命令的返回值?如果您查看的POSIX规范,您会发现
SIGCHLD
的默认行为记录为
I
(忽略)。但是,这是
信号(SIGCHLD,SIG\u DFL)
的设置,与
信号(SIGCHLD,SIG\u IGN)
的设置不同。令人困惑@fabregaszy不,我想一旦你忽略了SIGCHLD,就没有办法得到返回码了。乔纳坦利弗勒:非常棒的信息,谢谢@cnicutar我认为,如果您想要返回,您可以在这两者之间动态地将信号处理程序更改为
DFT
,然后在系统运行后再次将其更改为
IGN
。避免僵尸&同时获取系统返回。让我知道我的理解是否正确。谢谢!那么,在忽略SIGCHLD时,是否有可能获取命令的返回值?如果您查看的POSIX规范,您会发现
SIGCHLD
的默认行为记录为
I
(忽略)。但是,这是
信号(SIGCHLD,SIG\u DFL)
的设置,与
信号(SIGCHLD,SIG\u IGN)
的设置不同。令人困惑@fabregaszy不,我想一旦你忽略了SIGCHLD,就没有办法得到返回码了。乔纳坦利弗勒:非常棒的信息,谢谢@cnicutar我认为,如果您想要返回,您可以在这两者之间动态地将信号处理程序更改为
DFT
,然后在系统运行后再次将其更改为
IGN
。避免僵尸&同时获取系统返回。让我知道我的理解是否正确..您可能会发现其中一个或两个都很有用-它们都有相同的程序作为我答案的一部分:和。否:当您说您不关心子进程的退出状态时,没有(标准)方法来获取子进程的退出状态,这就是当您将
SIGCHLD
的信号处理设置为
SIG\u IGN
时所做的。您可能会发现其中一个或两个都很有用-它们都有相同的程序作为我答案的一部分:和。否:没有(标准)当您说不关心子进程的退出状态时,获取子进程的退出状态的方法,这是您在将
SIGCHLD
的信号处理设置为
SIG\u IGN
时所做的操作。