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

时间:2010-02-09 19:23:33

标签: perl

我正在进行一系列我希望并行运行的系统调用:

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

// block here

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

3 个答案:

答案 0 :(得分: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";

答案 1 :(得分:4)

分叉子进程以执行每个作业,并在父进程中等待这些进程在退出之前完成。

请参阅perldoc perlforkperldoc -f forkperldoc -f waitpid

(确切的代码留给读者练习 - 每个人都应该至少从头开始写一次,以了解所涉及的细节。此网站上也有很多例子。)< / p>

答案 2 :(得分:1)

如何从不同的线程运行每个系统调用并加入线程