多くの出力を複数のサブプロセスに送信する perl スクリプトがあります。すべてのパイプの終わりを閉じて、サブプロセスが作業を完了するのを待つ必要があります。これまでのところ、各パイプを閉じて、各サブプロセスが 1 つずつ終了するのを待つことに成功しただけです。より具体的には、次のようなことをしています。
for ($i=0;$i<24;$i++) {
my $fh;
open $fh, "|externalprogram $i";
$fhs{$i}=$fh;
}
#...now I can write output to the pipes
while (moreworktodo()) {
$whichone, $data = do_some_work();
print $fhs{$whichone} $data;
}
#Now I just need to wait for all the subprocesses to finish. However, they
#need to do a lot of work that can only begin when they've finished reading input. So I need to close my end of the pipe to indicate I'm finished.
for ($i=0;$i<24;$i++) {
my $file = $fhs{$i};
close $file; #unfortunately, this blocks until process $i finishes
#meanwhile all the other processes are waiting for EOF
#on their STDIN before they can proceed. So I end up waiting
#for 24 processes to finish one-at-a-time instead of all at once
}
すべてのサブプロセスをすぐに終了させる (stdin を閉じる) 方法の 1 つは、(パイプ) ファイルハンドルをまったく閉じずにスクリプトを終了させることですが、スクリプトはサブプロセスを必要とするより大きなジョブの一部であるため、これは良くありません。先に進む前に実際に行う作業。
各サブプロセスの stdin を閉じて (それらがすべて作業を終了できるように)、次に進む前にすべてが終了するのを待つ簡単な方法は何ですか? 子を分岐して各パイプを閉じようとしましたが、うまくいかないようです。親の「閉じる」だけが実際にサブプロセスの stdin を閉じ、サブプロセスが終了するのを待ちます。