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) Pure Perl по-прежнему может иметь множество взаимодействий с операционной системой, и то, как каждый системный вызов реагирует на сигналы, может сильно различаться в зависимости от платформы.Так что в общем случае ответ - нет.