环境: x86_64 上的 Linux 2.6.32 (RHEL 6.3) 和 gcc 4.4.6
背景:我正在运行一些繁重的数据处理:~500 GB 输入数据分布在~2000 个文件中。我的主进程分叉了 N 个子进程,每个子进程都会收到一个要处理的文件名列表。
我想要的是控制台 I/O 通过父级。我一直在研究pipe()
并看到一些关于使用poll()
让我的父母阻止的有趣的东西,直到有错误消息要阅读。看来我需要有 N 个管道(每个孩子一个)并传递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 吗?我想做阻塞还是非阻塞?