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

前端之家收集整理的这篇文章主要介绍了perl – 各种$SIG {CHLD}值之间有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这些设置有什么区别?
$SIG{CHLD} = 'IGNORE'  
$SIG{CHLD} = 'DEFAULT'  
$SIG{CHLD} = ''  
$SIG{CHLD} = undef

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

如果“忽略”意味着“SIG_IGN”,那么任何孩子都不会成为僵尸,事实并非如此.

从那里开始并没有那么清楚:

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.

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

行为:子进程正在调用“系统”或使用反引号创建另一个子进程,并且信号通常会被错误的(父)处理程序捕获.设置本地处理程序可以工作,但如果我希望来自祖母的信号什么都不做,我不明白哪个值最合适.

有人可以照亮我吗?

更新:
根据ikegami的反馈,我做了一些具体的测试.该行为至少部分是特定于平台的.

请考虑以下片段:

$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};

孩子会抑制那些消息.

在我试过的每一种味道上,收割机都看不到孩子.

解决方法

%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

$
原文链接:https://www.f2er.com/Perl/172859.html

猜你在找的Perl相关文章