2016-07-28 14 views
0
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) 

を完了したかどうかを確認し、私はdo_something()の内側に長い 何かをしている$brcmd開いています、私は$brcmdのperl:オープン経由でコマンドを実行すると、コマンドは、上記のコードで

を完了したかどうかを確認できるようにしたいです

提案がありますか?

+0

'waitpid'はあなたの友人です。 – Sobrique

+0

$ brcmdが終了したかどうかを確認するためにwhile(1)の中の@Sobrique waitpid? – ealeon

+0

@それは$ brcmdのPIDが必要ですか?どうやってそれを手に入れますか? – ealeon

答えて

2

それは長い時間(私はそれからものを読み取るために使用されていないが、もはやする必要があります)のためにするだけで何かです。私はちょうどそれが完了したかどうかを知ることができるようにしたい。

実行中は完全に何かをする必要がありますが、終了すると終了する必要があります。だから私はそれがそれから何もキャプチャせずに行われた場合に投票することができる必要があります。

それらが要件であれば、あなたは、親が行われたときに、その子のwaitpidを子(openの戻り値)のPIDを保存し、必要があります。もちろん

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を使用して外部コマンドを実行することができます

perldoc -f openは、実際にこの例を持っています。

+0

はい、ノンブロッキングwaitpidは私が探していたものです。ありがとうございました – ealeon

0

あなたは$brcmdが何であるかについてのヒントを与えることはありませんが、あなたはそれからパイプをオープンしているので、私はあなたがそのパイプから読み取られ、おそらく、ファイル

このような何かの終わりを待つことを示唆していますか?

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

my @output = <$br_fh>; 
+0

ええ、それはちょうど長い間(私はそれから物事を読むのに使用されていたが、もはや必要がある)何か。私はちょうどそれが完了したかどうかを知ることができるようにしたい。 – ealeon

+0

それは実行中に完全に何かをする必要がありますが、終了したら私は退出する必要があります。だから私はそれから何もキャプチャせずに行われた場合に投票することができる必要があります – ealeon

関連する問題