Если вам действительно нужно установить тайм-аут для данного системного вызова, это намного более простая проблема, чем асинхронное программирование.
Все, что вам нужно, это alarm () внутри блока eval ().
Вот пример блока кода, который помещает их в подпрограмму, которую вы можете вставить в свой код. В примере вызывается sleep, поэтому он не очень интересен для вывода, но показывает интересующую вас функцию тайм-аута.
Выход из бега это:
/ bin / sleep 2 fail: время ожидания на
./time-out строка 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 $@;
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 ($@) {
warn "@cmd failure: $@\n";
}
return $return;
}