perl – 各种$SIG {CHLD}值之间有什么区别?
这些设置有什么区别?
$SIG{CHLD} = 'IGNORE' $SIG{CHLD} = 'DEFAULT' $SIG{CHLD} = '' $SIG{CHLD} = undef 根据“UNIX环境中的高级编程,第2版”,图10.1 SIGCHLD的默认值是“忽略”. 如果“忽略”意味着“SIG_IGN”,那么任何孩子都不会成为僵尸,事实并非如此. 从那里开始并没有那么清楚:
我很难了解各种值(或未定义的非值)的影响.到目前为止,解决方案一直是旋转这些选择,直到我得到所需的行为,而我更确切地理解每个值如何定义信号的行为. 行为:子进程正在调用“系统”或使用反引号创建另一个子进程,并且信号通常会被错误的(父)处理程序捕获.设置本地处理程序可以工作,但如果我希望来自祖母的信号什么都不做,我不明白哪个值最合适. 有人可以照亮我吗? 更新: 请考虑以下片段: $SIG{CHLD} = sub { while( ( my $child = waitpid( -1,&WNOHANG ) ) > 0 ) { print "SIGNAL CHLD $childn"; } }; my $pid = fork(); if( ! $pid ) { system( 'echo Grandchild PID = $$' ); sleep 2; exit; } print "Child PID = $pidn"; sleep 5; Solaris 10上的Perl 5.8.6将显示system()调用的PID的“SIGNAL CHLD”消息.做任何事情,即使是微不足道的
孩子会抑制那些消息. 在我试过的每一种味道上,收割机都看不到孩子. 解决方法
见
%SIG .
$SIG {CHLD} =’IGNORE’;导致您的进程忽略SIGCHLD信号. $SIG {CHLD} =’DEFAULT’;导致您的流程处理SIGCHLD信号,因为它不会与$SIG {CHLD}或同等信息混淆.根据kill(1),我的系统上的进程默认忽略SIGCHLD $SIG {CHLD} =”;和$SIG {CHLD} = undef;不是有效值. 至于收割,系统会在退出后立即自动获取其SIGCHLD处理程序明确设置为IGNORE的父级子级. $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,command $pid"; ' PID STAT COMMAND $ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |