Perl的`system`如何在没有等待完成的情况下继续进行。

时间:2014-05-25 05:20:17

标签: perl system

在Perl中,command将等到"命令"完成了。有没有办法让command等待20秒?一种情况如下:

command是一个无限循环,不会完成。 command将冻结,程序无法继续。我希望程序不被command阻止。

我知道Ruby有办法做到这一点。 Perl有解决方案吗?

谢谢,

= Y

2 个答案:

答案 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都可以异步运行子进程。