-1

我正在做类似以下的事情:

我运行一个 Perl 脚本,它具有以下内容:

# First i install a signal handler for HUP which sets a global flag.
$SIG{"HUP"} = sub { print "HUP received\n"; $received_hup = 1 };
# Now i wait for HUP to be received.
my $cnt = 0;
for ($cnt = 0; $received_hup != 1 and $cnt < 900; $cnt++) {
   sleep(1); 
}
print ($received_hup == 1) ? "true" : "false";

然后我将 HUP 发送到这个 perl 进程。

我发现有时会打印错误,尽管每次也打印“收到 HUP”;即,尽管调用了信号处理程序,但并未修改全局变量。

我不熟悉 Perl 中的并发问题,所以请指导我。

4

1 回答 1

5

好吧,首先,您的程序实际上不可能打印“false”,因为您在打印中缺少一对括号:

print (($received_hup == 1) ? "true" : "false");

没有额外的一对,它被解析为:

(print($received_hup == 1)) ? "true" : "false";

这显然不是你想要的。

那个测试程序——用正确的括号修改——在这里工作得很好,在 Debian Linux w/perl 5.10 上。我试了 100 多次,每次都打印“HUP received”和“true”。如果那个确切的测试程序不适合你,我认为你只是有一个错误的 perl 版本。我相信 5.8 之前的旧版 perl 确实存在信号处理问题。

于 2009-09-06T12:35:53.953 回答