2012-01-09 9 views
2

私はちょうどLeon Timmermansの記事What you should know about signal based timeoutsを読んできましたが、それはSys::SigAction::timeout_call()の使用にどのように適用されるのか不思議でした。Sys :: SigAction :: timeout_callの使用は危険ですか?

1)まず、timeout_call()longjmpと危険な信号を使用していると思われますので、CERT Secure Coding rule SIG32-Cが該当します。

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

答えて

2

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 ([email protected] && [email protected] !~ quotemeta($ALARM_EXCEPTION)) { die } 

set_sig_handler無効のであれば/あまりにも、timeout_call意志そして、安全な信号処理を上書きします。

2)Pure Perlはまだオペレーティングシステムとのやりとりが多く、各システムコールが信号にどのように応答するかは、プラットフォームによって大きく異なる可能性があります。したがって、一般的に答えは「いいえ」です。

関連する問題