perl:通过open执行命令,看看命令是否已经完成

时间:2016-07-28 12:48:12

标签: perl

sub do_something {
    while(1) {
        #see if $brcmd has finished here
        # if ($BR finished) ?
        sleep 1;


    }
}

open $BR, q{-|}, $brcmd
    or die 'Cannot open BR';

do_something();

my $err = !(close $BR)

在上面的代码中,我是开放$brcmd,它做了很长时间 在do_something()内,我希望能够检查$brcmd是否已完成

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

  

它只是长期存在的东西(我曾经从中读过但不再需要)。我只是想知道它是否已经完成。

     

我需要在运行时完全做其他事情但是当它完成时我需要退出。所以我需要能够轮询它是否完成而没有捕获它。

如果这些是你的要求,你应该保存孩子的pid(open的返回值),然后,当父母完成时,waitpid关于孩子。

perldoc -f open实际上有一个例子:

my $child_pid = open(my $from_kid, "-|") // die "Can't fork: $!";

# ...

if ($child_pid) {
    # am the parent:
    # either write $to_kid or else read $from_kid
    ...
   waitpid $child_pid, 0;
} else {
    # am the child; use STDIN/STDOUT normally
    ...
    exit;
}

当然,如果你真的不需要从外部命令中读取任何内容,你可以fork然后使用exec执行外部命令。

答案 1 :(得分:0)

你没有提供关于$brcmd可能是什么的任何提示,但是既然你已经从中打开了一个管道,我建议你从那个管道中读取并等待文件结束

也许是这样的事情?

open my $br_fh, '-|', $brcmd or die "Cannot open BR command: $!";

my @output = <$br_fh>;