Nếu bạn thực sự chỉ cần đặt thời gian chờ trên một cuộc gọi hệ thống nhất định, đó là một vấn đề đơn giản hơn nhiều so với lập trình không đồng bộ.
Tất cả những gì bạn cần là báo động() bên trong khối eval().
Đây là một khối mã mẫu đặt chúng vào một chương trình con mà bạn có thể đưa vào mã của mình. Ví dụ gọi giấc ngủ như vậy là không thú vị cho đầu ra, nhưng không hiển thị cho bạn những chức năng chờ bạn đã quan tâm đến Sản lượng chạy nó là:.
/bin/ngủ 2 thất bại: thời gian chờ tại ./time dòng 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;
}
Nguồn
2009-11-18 03:21:10
Cảm ơn bạn, đây là những gì tôi đang tìm kiếm. – Joel
Tôi nghĩ bạn sẽ cần \ n trong thông điệp chết. (http://perldoc.perl.org/functions/alarm.html) – ddoxey