Wenn Sie wirklich nur eine Zeitüberschreitung für einen bestimmten Systemaufruf setzen müssen, ist das ein viel einfacheres Problem als die asynchrone Programmierung.
Alles, was Sie brauchen, ist Alarm() in einem eval() - Block.
Hier ist ein Beispielcode-Block, der diese in eine Unterroutine steckt, die Sie in Ihren Code einfügen können. Das Beispiel ruft Schlaf so für die Ausgabe nicht aufregend ist, aber Sie nicht zeigen, die Timeout-Funktionalität, die Sie interessierten sich Output es läuft.
/bin/Schlaf 2 failure: Timeout bei ./time -out Linie 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;
}
Danke, das ist mehr, was ich gesucht habe. – Joel
Ich denke, du brauchst ein \ n in der Würfel Nachricht. (http://perldoc.perl.org/functions/alarm.html) – ddoxey