2016-04-14 9 views
4

私はIO::Selectを使用しています。IOに関する明確化

フォークされたプロセスを手動で強制終了した場合にのみ、このコードが終了するとは思われませんでした。これは正しい動作ですか?任意のパイプで連結されたファイルハンドルを閉じる

openから
use strict; 
use warnings; 

STDOUT->autoflush(); 

use IO::Select; 

open(my $ph, "-|", "perl -e 'sleep 1 while 1'"); 

my $sel = IO::Select->new(); 

$sel->add($ph); 

$sel->can_read(2) or warn "timeout\n"; 

print "woohoo?\n"; 

答えて

7

はその後$?${^CHILD_ERROR_NATIVE}にステータス値を返し、子供が終了するのを待つために、親プロセスが発生します。

だから子供が完了するのを待ち( $phがスコープの外に出たときに行われる) $phにファイルハンドルを閉じます。

は(これはIOとは何の関係もありません選択するかselect ::。)

+0

'長い生活PIDの' STDOUT'モニタリングに適したタイムアウト付きIO :: SELECT'ですか? –

+0

@Сухой27、「STDOUTモニタリング」の意味がわかりません。 – ikegami

+0

私はフォークされたプロセスの出力を監視することを意味します。数秒間出力を待ってから何か他のことをしてからもう一度待ってください。 –