2011-11-15 453 views
1

我正在讀取來自管道的未知數量的消息。但是,讀取被阻止。我試過下面的代碼將讀取設置爲非阻塞。但是,這會導致讀取錯誤和進程無法讀取。從管道讀取阻塞

// Set pipe to non-blocking 
sleep(5); 
fcntl(fd[index][0], F_SETFL, O_NONBLOCK); 

如何在不掛起程序的情況下成功讀取和打印所有消息? 以下是導致問題的代碼:

// Read every message 
while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int)) 
    printf("process%d has received a message from process%d\n", index, mymsg); 
+0

閱讀有關select,poll和epoll的文檔。 –

+0

你會得到什麼錯誤?無阻塞的套接字在沒有任何內容需要讀取時總會返回「讀取錯誤」。 –

+0

@ZanLynx這是正確的。當有足夠的流程啓動時。幾個進程將退出並出現讀取錯誤。 – sj755

回答

1

使用select()或epoll()。這是在沒有多線程的情況下實現非阻塞讀取(或寫入)的標準方式。

+0

你能舉個例子來說明我的情況嗎? – sj755

+0

閱讀select()中的數百個教程之一。 –