使用Sys :: SigAction :: timeout_call unsafe?

时间:2012-01-09 17:21:52

标签: perl signals longjmp

我刚读过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是否可以安全使用?

1 个答案:

答案 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仍然可以与操作系统进行充分的交互,并且每个系统调用对信号的响应方式在不同平台之间可能有很大差异。所以一般来说答案是否定的。