環境: gcc4.4.6を使用するx86_64上のLinux2.6.32(RHEL 6.3)
背景:私はいくつかの重いデータ処理を実行しています:〜2000ファイルに広がる〜500GBの入力データ。私のメインプロセスはN個の子をフォークし、それぞれがクランチするファイル名のリストを受け取ります。
私が欲しいのは、コンソールI/Oが親を通過することです。私は、読むべきエラーメッセージが表示されるまで、親ブロックを使用するためにpipe()
使用することについていくつかの魅力的なものを調べて見ています。poll()
N本のパイプ(子供ごとに1本)がpoll()
必要で、聞きたい信号に関する情報を渡す必要があるようです。また、私がそれぞれの子供に入ると、それぞれの子供はいつものようにパイプに書き込むことができるはずだと思いますよね?dup2(pipe[1], STDOUT)
cout << stuff;
最初に、私が複数のパイプについて上で言ったことは正しいpoll()
ですdup2()
か?
次にpoll()
、すべての子が死んだら次に進むように親ループを設定するにはどうすればよいですか?
現在、コードのこの(不完全な)セクションは次のようになっています。
int status;
while (1) { // wait for stuff
while ((status = poll(pollfds, ss.max_forks, -1)) > 1)
cout << "fork "<< status << ": " << pipes[status][0];
if (status == -1) Die(errno, "poll error");
if (status == 0) { // check that we still have at least one open fd
bool still_running = false;
for (int i=0; i<ss.max_forks; i++) {
// check pipe i and set still_running if it is not zero
}
if (!still_running)
break;
}
}
第三に、何を設定し、いつfcntl()で設定する必要がありますか?O_ASYNCを実行しますか?ブロッキングまたは非ブロッキングを実行しますか?