環境:在與海灣合作委員會x86_64的 2.6.32的Linux(RHEL 6.3)4.4.6新管道()和調用fork()C++ -
背景:我正在做一些繁重的數據搗鼓:約500 GB輸入數據分佈在〜2000個文件中。我的主要過程分叉N個孩子,每個孩子都會收到一份要緊縮的文件名列表。
我想要是用於控制檯I/O通過父母。我一直在尋找到pipe()
,看看如何使用poll()
,直到有錯誤消息讀給有我的父母塊一些有趣的東西。看起來我需要N管(每個孩子一個)並且通過我想聽的信號通過poll()
。另外,我覺得,一旦我dup2(pipe[1], STDOUT)
在每個孩子,每個孩子應該能寫到管道與cout << stuff;
像往常一樣,對不對?
第一個,就是我上面說的關於多個管道,poll()
ing和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嗎?我想做阻擋或非阻擋嗎?
你期望有多少個孩子?也許你最好使用單一的fifo或域套接字。 –