Если вам действительно просто нужно поставить тайм-аут на заданный системный вызов, это гораздо более простая проблема, чем асинхронное программирование.
Все, что вам нужно, это alarm() внутри блока eval().
Вот пример кода, который помещает их в подпрограмму, которую вы могли бы вставить в свой код. Пример вызывает сон, так не интересно для вывода, но покажет вам функции тайм-аута вы были заинтересованы в Выход Забегая:.
/bin/спящий режим 2 отказ: тайм-аут при ./time отъезда линия 15.
$ cat time-out
#!/usr/bin/perl
use warnings;
use strict;
my $timeout = 1;
my @cmd = qw(/bin/sleep 2);
my $response = timeout_command($timeout, @cmd);
print "$response\n" if (defined $response);
sub timeout_command {
my $timeout = (shift);
my @command = @_;
undef [email protected];
my $return = eval {
local($SIG{ALRM}) = sub {die "timeout";};
alarm($timeout);
my $response;
open(CMD, '-|', @command) || die "couldn't run @command: $!\n";
while(<CMD>) {
$response .= $_;
}
close(CMD) || die "Couldn't close execution of @command: $!\n";
$response;
};
alarm(0);
if ([email protected]) {
warn "@cmd failure: [email protected]\n";
}
return $return;
}
Спасибо, это больше того, что я искал. – Joel
Думаю, вам понадобится \ n в сообщении die. (Http://perldoc.perl.org/functions/alarm.html) – ddoxey