忽略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
时所做的操作。