3

我编写了以下代码来测试孩子和父母之间的信号。理想情况下,当孩子向父母提供 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;
        }
    }

}

有人可以为这个问题提供一个解决方法或其他方式来向父级发出信号,以便它进入新的迭代。

4

2 回答 2

3

5.6.X 上的失败可能是因为 Perl 处理信号的方式,在 Perl 5.8.0 中使用“安全信号处理”修复了这种方式。在任何一种情况下,您使用的 Perl 实际上都具有考古价值,您应该向您的主人强烈主张您应该至少使用 Perl 5.12,最好是 5.14。

于 2012-05-17T07:52:16.400 回答
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;
        }
    }
}
于 2012-05-17T13:25:19.933 回答