gpt4 book ai didi

perl - 各种$ SIG {CHLD}值之间有什么区别?

转载 作者:行者123 更新时间:2023-12-04 04:52:12 24 4
gpt4 key购买 nike

这些设置之间有什么区别?

$SIG{CHLD} = 'IGNORE'  
$SIG{CHLD} = 'DEFAULT'
$SIG{CHLD} = ''
$SIG{CHLD} = undef

根据“UNIX环境中的高级编程,第二版”,图10.1,SIGCHLD的默认值为“忽略”。

如果“ignore”的意思是“SIG_IGN”,则没有 child 会成为僵尸,事实并非如此。

从那里并没有变得更加清晰:

If the process specifically sets its disposition to SIG_IGN, children of the calling process will not generate zombie processes. Note that this is different from its default action (SIG_DFL), which from Figure 10.1 is to be ignored. Instead, on termination, the status of these child processes is discarded.



我很难理解各种值(或未定义的非值)的影响。到目前为止,解决方案是轮流选择这些选项,直到获得所需的行为为止,而我宁愿确切地了解每个值如何定义信号的行为。

行为:子进程正在调用“系统”或使用反引号来创建另一个子进程,并且该信号通常会被错误的(父)处理程序捕获。设置本地处理程序可以工作,但是如果我希望孙子的信号不执行任何操作,则我不知道哪个值最合适。

有人可以照亮我吗?

更新:
根据池上的反馈,我进行了一些具体的测试。该行为至少部分是平台特定的。

考虑以下片段:
$SIG{CHLD} = sub {
while( ( my $child = waitpid( -1, &WNOHANG ) ) > 0 ) {
print "SIGNAL CHLD $child\n";
}
};

my $pid = fork();

if( ! $pid ) {
system( 'echo Grandchild PID = $$' );
sleep 2;
exit;
}

print "Child PID = $pid\n";
sleep 5;

Solaris 10上的Perl 5.8.6将显示system()调用的PID的“SIGNAL CHLD”消息。做任何事情,甚至微不足道

local $SIG{CHLD};



在 child 中会抑制那些信息。

在我尝试过的所有其他口味上,收割者再也看不到 child 了。

最佳答案

参见 %SIG
$SIG{CHLD} = 'IGNORE';使您的进程忽略SIGCHLD信号。
$SIG{CHLD} = 'DEFAULT';会使您的进程对待SIGCHLD信号,就如同您不将其与$SIG{CHLD}或等效的邮件弄乱一样。根据kill(1),系统上的进程默认情况下会忽略SIGCHLD
$SIG{CHLD} = '';$SIG{CHLD} = undef;是无效值。

至于收割,系统将在退出时立即自动将其SIGCHLD处理程序显式设置为IGNORE的 parent 的 child 收割。

$ perl -e'
my $pid = fork;
if (!$pid) { sleep(1); exit; }
sleep(2);
system "ps -o pid,stat,command $pid";
'
PID STAT COMMAND
14667 ZN+ [perl] <defunct>

$ perl -e'
$SIG{CHLD}="IGNORE";
my $pid = fork;
if (!$pid) { sleep(1); exit; }
sleep(2);
system "ps -o pid,stat,command $pid";
'
PID STAT COMMAND

$

关于perl - 各种$ SIG {CHLD}值之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8389400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com