スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

fork()を使わないfork 

子プロセス→親プロセス方向の通信を行う場合
perlでforkして親プロセスと複数の子プロセスの間で通信を行う時、子プロセスの標準出力を親プロセスがファイルハンドルで受け取るようにするためには次のようにする。


unless($child = open($fh->[$childNum], "-|"))
{  #child
  &child();
  exit;
}else
{  #parent
  my($dummy) = $fh->[$childNum];
  #子プロセスの標準出力への出力を受け取るファイルハンドルを追加
  $select->add(* $dummy);
}
#$select->can_read()で子プロセスが出力したファイルハンドルを配列で受け取る。
while(@ready = $select->can_read)
{  foreach my $fileHandle (@ready)
  {
   my $l = <$fileHandle>;
  }
}


上記コードにより、親プロセスは$select->can_readでブロックする。親プロセスが子プロセスからの出力を受け取ると、返り値として読み込む準備のできたファイルハンドル配列を受け取る。

双方向通信を行う場合
複数の子プロセスを作り、親子間で双方向の通信を行う時にはどうやるんだっけっかな。IPC::Open3(またはIPC::Open2)を用いてforkしてやればよい模様。forkするときにopen()ではなくopen3()を用いることが異なるくらいのはず。
IPC::open3は「の」に書かれているように、STDERRのためのファイルハンドルの扱いに注意が必要でSymbol::gensymを使用して適当なファイルハンドルを用意して使う。(ここで言う"適当な"とは日常で良く使う方の意味。つまりなんでも良いけどSTDOUTのものと重複しないものを。)

コメント

コメントの投稿















管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://haginov.blog35.fc2.com/tb.php/87-6d9155e7

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。