2016-10-07 43 views
0

我想知道如果我管的使用是正確的,這個代碼是在fork()的子進程,並PFD是管指針:如何在循環中使用管道,是否正確?

char buf[1024]; 
while(1){ 
    signal(SIGUSR1, OnSigUsr1); 
    sleep(10000); 
    if(get==1){ 
     get=0; 
     close(pfd[1]); 
     read(pfd[0], buf, sizeof(buf)); 
     close(pfd[0]); 
    } 
} 

父代碼的代碼另一個情節:

char buffer[1024]; 
/*put something in buffer*/ 
close(pfd[0]); 
if(write(pfd[1], buffer, strlen(buffer))==-1){ 
    printf("error write\n"); 
}; 
close(pfd[1]); 
kill(fpid,SIGUSR1); 

我的問題是緩衝區可以寫入並從fork()獲取一次,下一次不能再次寫入管道並返回error write。我想知道我是否把它弄錯了。謝謝。

+3

歡迎來到Stack Overflow!尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包含所需的行爲,特定的問題或錯誤,以及**在問題本身中重現**所需的最短代碼。對其他讀者沒有明確問題陳述的問題 沒有用處。請參閱:[如何創建最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)。 – jforberg

+0

什麼是初始化? OnSigUsr1的定義是什麼? –

回答

0

對於管道,如果管道已滿,則寫入塊。

請注意,寫入管道寫端的數據會在內核中緩存,直到從管道的讀端讀取爲止。

child : pfd [1]可以在兒童中關閉,因爲它不在兒童中使用。但是,如果隨後要由孩子使用,則不需要關閉pfd [0]。

parent :同樣,pfd [0]可以在父項中關閉,因爲它不在父項中使用。但是,如果隨後由父項使用,則不需要關閉pfd [1]。

+0

謝謝,你是對的!有用。你知道有什麼區別嗎? – shen

+0

爲了大家的利益,你可以分享所做的改變。 –

+0

只是在孩子中關閉pfd [0]並在父母中關閉pfd [1]。我需要重新發布嗎?原始代碼非常長。 – shen

1

您只能將數據寫入打開的文件描述符。在寫入緩衝區之後父節點執行close(pfd[1]);,並且在讀取緩衝區之後子節點執行close(pfd[0]);。如果要再次使用它,請不要關閉文件描述符,但在程序退出之前關閉所有打開的文件描述符。

+0

「在程序退出前關閉所有打開的文件描述符」:不需要。所有文件描述符在程序退出時自動關閉:http://pubs.opengroup.org/onlinepubs/9699919799/functions/_exit.html – jforberg

+0

@jforberg,當程序無法自行清理後,它是一個草率的代碼。你不應該習慣於在程序之後清理操作系統。除其他原因外,並非每個應用程序都在OS上運行。 – user3629249

+0

現代的,全功能的操作系統清理後,馬虎代碼是用戶友好的(如果一個程序員編寫草率的代碼,它不會使系統關閉),但不是所有的操作系​​統都這樣做,這就是爲什麼你不應該寫的草率代碼。 –

相關問題