我正在做类似以下的事情:
我运行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中的并发问题,所以请指导我.
好吧,首先,你的程序实际上不可能打印"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确实存在信号处理问题.