perl的 - 孩子过程中的信令父(perl - child process signaling p

2019-09-17 07:15发布

我写了下面的一段代码,以测试儿童和父母之间的信令。 理想的情况是,当孩子给出了一个SIGINT父父应该回来,在新的迭代,并等待用户输入。 这是我在Perl 5.8已经观察到,但在Perl 5.6.1(我要求我使用)母公司实际上是“封杀”。 有没有下一次迭代。

my $parent_pid = $$;
$pid = fork();
if($pid == 0)
{   
    print "child started\n";
    kill 2, $parent_pid;
}
else
{
    while(1)
    {
        eval
        {
            $SIG{INT} = sub{die "GOTCHA";};
            print 'inside parent'."\n";
            $a = <>;
        };
        if($@)
        {
                print "got the signal!!!!\n$@\n";
                next;
        }
    }

}

可能有人请给这个问题,或者一些其他的方式,使其进入新的迭代信号的父外观图释。

Answer 1:

在5.6.X的失败可能是因为Perl用于处理信号的方式,这是固定在Perl 5.8.0“安全信号处理” 。 在这两种情况下,你使用一个Perl这实际上是考古,你应该据理力争,以你的主人,你应该Perl的5.12使用至少,最好5.14。



Answer 2:

这很可能是一个竞争条件,造成孩子发送SIGINT前家长已经准备好了。 请记住,你以后fork()您将有两个独立的过程,每个过程可能会继续在它喜欢的任何步伐。

这是最好的,你的情况来设置SIGINT的前处理fork()调用,所以你知道它绝对到位之前,孩子试图kill()其父。

(有一些小的修改):

$SIG{INT} = sub { die "GOTCHA" };

my $parent_pid = $$;
defined( my $pid = fork() ) or die "Cannot fork() - $!";

if($pid == 0)
{   
    print "child started\n";
    kill INT => $parent_pid;
}
else
{
    while(1)
    {
        eval
        {
            print "inside parent\n";
            <>;
        };
        if($@)
        {
            print "got the signal!!!!\n$@\n";
            next;
        }
    }
}


文章来源: perl - child process signaling parent