我正在做以下事情:
我运行一个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中的并发问题,所以请指导我。
答案 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确实存在信号处理问题。