在Perl中,command
将等到"命令"完成了。有没有办法让command
等待20秒?一种情况如下:
command
是一个无限循环,不会完成。 command
将冻结,程序无法继续。我希望程序不被command
阻止。
我知道Ruby有办法做到这一点。 Perl有解决方案吗?
谢谢,
= Y
答案 0 :(得分:6)
使用alarm
:
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm 20;
system("<Your command>")
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}
答案 1 :(得分:0)
#!/usr/bin/perl -w
use strict;
use 5.010;
my $foo = 123;
my $pidChild = fork(); # All objects before this fork statement will be copied.
given ($pidChild)
{
when (!defined($_)) {
die "Cannot fork: $!";
}
when ($_ == 0) {
# The child process goes here.
$foo = 456; # This is a duplicate.
system 'subprocess options'; # Or: exec 'suprocess options';
}
default {
# The original process goes here.
waitpid($_, 0); # Whether to wait or not is up to you.
say $foo; # Output: 123
}
}
如果需要进程间通信(IPC),则在调用fork
之前,内置函数pipe
可用于创建2个处理程序,一个用于输入,另一个用于输出,它们将由原始进程和子进程共享。
确实有多种方法可以进行IPC。内置函数open
,模块IPC :: Open2提供的子例程open2
和IPC :: Open3提供的open3
都可以异步运行子进程。