2012-10-01 74 views
0

我有一個父進程,它有兩個子進程fork掉。我創建了兩個管道(每個孩子一個)。對於每個管道,我已經關閉了父節點的寫入結束和子節點的讀取結束。C - 從兩個管道(兩個子進程的父節點)同時讀取?

我遇到的問題是讓父母同時從每個子管道讀取。它似乎只是從我嘗試讀取的第一個管道讀取。

//PARENT 
while(1) 
{ 
    read(fd[0], buffer, sizeof(buffer)); 
    //print out buffer 
    read(fd2[0], buffer2, sizeof(buffer2)); 
    //print out buffer2 
} 

打印的唯一信息是來自我第一次讀取的電話的信息。我認爲閱讀似乎阻止了其他閱讀。我在網上查找並找到了一個可能的解決方案,但無法弄清楚如何使用管道來實現它(似乎沒有任何地方的例子)。

有人可以解釋如何選擇與管道工作或通知我的任何其他可能的解決方案,我的問題?

+0

請閱讀您的系統文檔以選擇。 ('人選')。許多精選的手冊頁都有很多實例。 –

+0

你的大綱代碼將同步閱讀來自一個孩子和另一個孩子的消息。我相信'buffer2'與'buffer'的大小是一樣的,因爲你也使用'buffer'的大小來進行第二次讀取。 –

回答

2

您的閱讀被阻止。這意味着當你調用read時,它會等待,直到它有你請求的字節數或流被關閉(命中EOF)。

您可能需要使管道非阻塞(使用fcntl(fd[0], F_SETFL, O_NONBLOCK);)或使用線程。

編輯添加喬納森萊弗勒的觀點:

如果使用非阻塞這將是最有效的調用select()。這將節省您浪費大量CPU時間(這是在啓用非阻塞時發生的情況,因爲當沒有數據存在時讀取會立即返回)。例如:

int fds[2]; 
... 
fds[0] = fd[0]; 
fds[1] = fd2[0]; 

while... 
    select(2, &fds, NULL, NULL, NULL); 
    read(...); 
    read(...); 
+1

設置O_NONBLOCK可能導致忙輪詢;使用'select()'或其一個變體可能會更好。 –

相關問題