2010-12-08 58 views
5

我正在使用一個未命名的管道進行通過fork()創建的父進程和子進程之間的進程間通信。我正在使用包含在unistd.h中的pipe()函數。我假設一旦兩個文件描述符都被關閉(並且在兩個進程中),管道被釋放/釋放/銷燬/等等。但是我沒有發現任何明確說明這一點的手冊頁。我正在製作一個將運行很長時間的程序,所以我想要防止內存泄漏和其他性質的事情。一旦兩個文件描述符都關閉,Linux是否會自動釋放一個未命名的管道?

我的函數體看起來像:

int pipefds[2]; 

pipe(pipefds); 

if (fork() == 0) { 

    close(pipefds[1]); 
    ... 
    //Use pipefds[0] 
    close(pipefds[0]); 

} else { 

    close(pipefds[0]); 
    ... 
    //Use pipefds[1] 
    close(pipefds[1]); 
} 

它是安全的假設,在兒童和該管已釋放/父既此函數終結後釋放/破壞的/ etc。 ?

是否有任何文件明確說明這一點?

謝謝

回答

6
http://www.opengroup.org/onlinepubs/009695399/functions/close.html

當與管道或FIFO專用文件關聯 所有文件描述符是 關閉時,管 剩餘或FIFO將被丟棄的任何數據。

實際上並不所有的資源被釋放,因爲內部籽粒格賓斯不是「數據管道中剩餘的」,但我認爲我們可以有把握地假設,如果你的內核之後,保持什麼,這是你的內核的業務,而不是你的:-)

5

close文檔說這個。

The close() call deletes a descriptor from the per-process object reference 
table. If this is the last reference to the underlying object, the 
object will be deactivated. 
+0

謝謝!答案和Steve Jossop的回答都很好,但我接受了Steve Jessop的回答,因爲它提供了可靠來源的文檔,文檔明確提到了管道。 – pcd6623 2010-12-10 13:28:25

0

那麼,你可以做的唯一的事情是關閉管道的兩端,對吧?是的,一旦管道兩端的所有手柄都關閉,管道將被釋放。

相關問題