3

Leon Timmermansの記事を読んだばかりですが、シグナルベースのタイムアウトについて知っておくべきことと、それがの使用にどのように適用されるのか疑問に思っていましたSys::SigAction::timeout_call()

1)まず第一に、安全でない信号 をtimeout_call()使用しているように思われるため、 CERTセキュアコーディングルールSIG32-Cが適用されます。longjmp

2)timeout_callタイムアウトを監視しているコードに純粋なperlコードのみが含まれている場合(つまり、XSモジュールへの呼び出しがない場合)は安全に使用できますか?

4

1 に答える 1

3

1)レオンの例timeout_call()とほぼ同じイディオムを使用して、システムコールをブロックにラップします。eval/alarm

my $ALARM_EXCEPTION = "alarm clock restart";
my $h;
eval {
    $h = set_sig_handler('ALRM', sub { die $ALARM_EXCEPTION }, { });
    alarm 10;
    flock $fh, 2 or die "cannot flock: $!";
    alarm 0;
};
alarm 0;
$SIG{ALRM} = $h;
if ($@ && $@ !~ quotemeta($ALARM_EXCEPTION)) { die }

したがって、set_sig_handler安全な信号処理を無効化/オーバーライドする場合timeout_callも、そうなります。

2)純粋なPerlは、オペレーティングシステムとの相互作用を十分に持つことができ、各システムコールがシグナルにどのように応答するかは、プラットフォーム間で大きく異なる可能性があります。したがって、一般的に答えはノーです。

于 2012-01-09T18:20:06.670 に答える