我刚读过Leon Timmermans的文章What you should know about signal based timeouts,我想知道它是否适用于Sys::SigAction::timeout_call()
。
1)首先,似乎timeout_call()
使用了longjmp
和不安全的信号,因此CERT Secure Coding rule SIG32-C适用。
2)如果被监视超时的代码只包含pure-perl代码(即没有调用XS模块),timeout_call
是否可以安全使用?
答案 0 :(得分:2)
1)timeout_call()
使用几乎完全相同的习惯用语来封装eval/alarm
块中的系统调用,如Leon的例子:
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)Pure Perl仍然可以与操作系统进行充分的交互,并且每个系统调用对信号的响应方式在不同平台之间可能有很大差异。所以一般来说答案是否定的。