Se si ha davvero bisogno di mettere un timeout su una determinata chiamata di sistema è un problema molto più semplice della programmazione asincrona.
Tutto ciò di cui hai bisogno è alarm() all'interno di un blocco eval().
Ecco un esempio di blocco di codice che inserisce questi in una subroutine che è possibile inserire nel codice. L'esempio chiama sonno in modo non è entusiasmante per l'uscita, ma non si mostrano le funzionalità di timeout si erano interessati a Output di esso è:.
/bin/sleep 2 fallimento: timeout a ./time linea -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 [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;
}
fonte
2009-11-18 03:21:10
Grazie, questo è più quello che stavo cercando. – Joel
Penso che avrai bisogno di un \ n nel messaggio del dado. (Http://perldoc.perl.org/functions/alarm.html) – ddoxey