-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プロセスに送信します。

「HUPreceived」も毎回印刷されますが、falseが印刷されることがあります。つまり、シグナルハンドラが呼び出されても、グローバル変数は変更されません。

私はPerlの並行性の問題に精通していないので、これを教えてください。

4

1 に答える 1

5

まず最初に、あなたのプログラムが "false" を出力することは実際には不可能です。

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

その余分なペアがなければ、次のように解析されます。

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

これは明らかにあなたが望むものではありません。

そのテスト プログラム — 正しい括弧で修正されたもの — は、ここでは、Debian Linux with perl 5.10 で問題なく動作します。100回以上試してみましたが、毎回「HUP received」と「true」が出力されました。その正確なテスト プログラムが機能しない場合は、バグのあるバージョンの perl を使用しているだけだと思います。5.8 より前の古いバージョンの perl には、シグナル処理の問題があったと思います。

于 2009-09-06T12:35:53.953 に答える