2011-08-31 95 views
1

爲什麼下面的程序不能在第二read呼叫阻止?FIFO不會阻止上閱讀

int pid = fork(); 

if(pid) { 
    int fifo = open("testfifo", O_RDWR); 

    char buf[20]; 

    while(1) { 
     read(fifo, buf, 10); 
     puts(buf); 
    } 

} else { 
    int fifo = open("testfifo", O_WRONLY); 

    write(fifo, "teststring", 10); 

    close(fifo); 
} 

return 0; 

第二read呼叫繼續返回0即使FIFO變成空的,它應該在read呼叫阻塞。

我錯過了什麼嗎?

的操作系統是Windows和管道已經用mknod testfifo p創建。

+0

*不*忽略read()的返回值。將0解釋爲「文件結尾」,將<0解釋爲錯誤。你應該在這裏得到eof,你關閉了管道。 –

+0

@Simone對我狡猾的編輯道歉 - 顯然不打算破壞你的問題! – razlebe

+0

@Hans但我想要的是阻塞讀等待其他進程在管道 – Simone

回答

3

我發現,從另一個計算器的問題,我應該打開和關閉「服務器」管,在這種情況下,每次父進程的管道;所以這是正確的代碼:

int pid = fork(); 

if(pid) { 
    char buf[20]; 

    while(1) { 

     int fifo = open("testfifo", O_RDWR); 
     read(fifo, buf, 15); 
     close(fifo); 

     puts(buf), fflush(stdout); 
    } 
} else { 
    int fifo = open("testfifo", O_WRONLY); 
    write(fifo, "teststring", 15); 
    close(fifo); 
} 
0

您沒有關閉該文件

編輯:刪除了一些尷尬。

+0

試過了,但問題依然存在;實際上我認爲在過程結束時系統會關閉fifo。此外,如果您查看代碼,則會出現無限循環,因此您添加的close(fifo)不會執行。 – Simone

+0

ops ...我會編輯這個 – Johannes