3

私はこのperlスクリプトを持っています:

#!/bin/perl
use strict;
use warnings;
use Time::HiRes qw(usleep);
my $fd;
sub reopen {
    open $fd, ">>", "file.log" or die $!;
}
$SIG{USR1} = \&reopen;
reopen();
while(1){
    syswrite $fd, time . " ($$): message\n";
    usleep(100000);
}

シグナル ハンドラでファイル ハンドルを再度開きます。安全ですか?

4

1 に答える 1

5

はい[1]。5.8.1 以降、実際のシグナル ハンドラは、シグナルが受信されたことを示すフラグを設定するだけです[2]。そのフラグはステートメント間でチェックされます。システム コール (例: )は、シグナルによって中断されたときusleepにエラーを返し、フラグをチェックできるようにします。$!{EINTR}

シグナルは中断usleepし、reopen次のステートメント ( syswrite[3] ) が評価される前に呼び出されます。


  1. local ($!, $^E);中断されたコードがこれらを使用する場合に備えて、実行したい場合があります。
  2. 「安全な信号」を無効にしない限り。
  3. syswriteの代わりになぜ使用しているのprintですか? バッファリングを避けるためですか?そのために使用$fd->autoflush(1);します。
于 2013-06-07T18:47:20.167 に答える