在Perl中,如何阻止一堆系统调用完成?

Ros*_*ers 10 perl

我正在做一堆我希望并行运行的系统调用:

system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");

// block here
Run Code Online (Sandbox Code Playgroud)

在完成所有系统调用之前,如何阻止程序流程?

fri*_*edo 9

最简单的方法是fork为每个系统调用创建一个新的子进程,然后等待它们完成.这是一个简化的例子:

my @commands = ( "sleep 5 && echo step 1 done",
                 "sleep 3 && echo step 2 done",
                 "sleep 7 && echo step 3 done" );

my @pids;
foreach my $cmd( @commands ) {
    my $pid = fork;
    if ( $pid ) {
        # parent process
        push @pids, $pid;
        next;
    }

    # now we're in the child
    system( $cmd );
    exit;            # terminate the child
}

wait for @pids;   # wait for each child to terminate

print "all done.\n";
Run Code Online (Sandbox Code Playgroud)

  • 它会膨胀这个例子,所以我不想抱怨,但如果`fork`失败,它会返回`undef`,这是假的,然后这个代码做错了.另外,我投票使用`exec`而不是`system + exit` - Perl的`exec`允许你给它一个完整的字符串,比如这些. (6认同)