为什么我的HUP信号处理程序不更新Perl中的全局变量?

时间:2009-09-06 10:41:45

标签: perl signals

我正在做以下事情:

我运行一个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中的并发问题,所以请指导我。

1 个答案:

答案 0 :(得分:5)

嗯,首先,你的程序实际上不可能打印“false”,因为你在打印中遗漏了一对括号:

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

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

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

这显然不是你想要的。

那个测试程序 - 用正确的括号修改 - 在Debian Linux w / perl 5.10上运行得很好。我尝试了100多次,每次打印“HUP收到”和“真实”。如果那个确切的测试程序不适合你,我想你只是有一个错误的perl版本。在我认为5.8之前的旧版perl确实存在信号处理问题。