我必須在UNIX中模擬C程序中的shell行爲,記住一件重要的事情:父進程接收所有命令並將它們發送給子進程。然後小孩執行收到的命令,然後將輸出發送給父親。 這個想法是,我收到父母和我的主要子fork()的命令,以便他自己的孩子可以execvp命令並將輸出發送到fifo管道。問題是我不能打破while循環(打印出正確的輸出):打破從fifo頻道讀取的while循環
mkfifo("output",S_IFIFO|0644);
while(read(fifod2,&c,1))
printf("%c",c);
我意識到FIFO的大小是可變的,但結束時,第二個孩子必須發送一個EOF,這樣當讀取達到它,返回0.但這似乎並沒有發生。 如果需要,請向我諮詢更多代碼部分。 謝謝
'read()'可能失敗,狀態-1指示錯誤。這並沒有打破循環。在這種情況下,你應該測試'while(read(fifod,&c,1)== 1)',儘管你應該使用批量輸入:while((nbytes = read(fifod,buffer,sizeof(buffer) )> 0)'一次處理儘可能多的數據,這不會等待FIFO填滿;如果可用,它將返回'短讀'(少於指定的最大字節數)。它會降低系統的負載 - 單字節I/O是可行的,但效率不高(儘管這兩者都不是非常低效)。 –
另外,請注意'mkfifo()'創建一個特殊類型的文件;它不會打開正如bdonlan所說,如果在任何進程中在FIFO上有一個可寫的文件描述符被打開,那麼在FIFO上沒有得到EOF的問題就會發生。要非常小心FIFO的實際打開位置,以及它是打開的 –