當看到有關在UNIX環境高級編程管道,我注意到一個fork之後家長可以close()
管道的讀端,並沒有關閉的讀端孩子。當進程分叉時,其文件描述符是否被保留?行爲的管道的()
我的意思是,在fork之前,管道讀取文件描述符的保留計數爲1,並且在fork 2之後。當父節點關閉它的讀取端時,fd轉到1並保持打開狀態兒童。這基本上是發生了什麼?這種行爲對於普通文件描述符是否也會發生?
當看到有關在UNIX環境高級編程管道,我注意到一個fork之後家長可以close()
管道的讀端,並沒有關閉的讀端孩子。當進程分叉時,其文件描述符是否被保留?行爲的管道的()
我的意思是,在fork之前,管道讀取文件描述符的保留計數爲1,並且在fork 2之後。當父節點關閉它的讀取端時,fd轉到1並保持打開狀態兒童。這基本上是發生了什麼?這種行爲對於普通文件描述符是否也會發生?
正如人們所瞭解fork()手冊頁上寫着:
子進程都有自己的父文件 描述符的副本。每個孩子的文件 描述應參照同一 打開文件的描述與 父的 相應的文件描述符。
所以是的,孩子有父母的文件描述符的確切副本,並指的是他們所有人,包括打開的文件。
是的,分支複製所有打開的文件描述符。
因此,對於一個典型的管,2縫隙陣列(INT FD [2]),FD [0]是用於父和子相同,因此是FD [1]。
您可以在不分叉在所有創建管,並且通過使用FD [0]和FD [1]在一個過程中讀/寫給自己。
通向令人敬畏的http://cr.yp.to/docs/selfpipe.html技巧! – ephemient 2010-03-11 21:45:51
答案是肯定的,是的(這同樣適用於所有文件描述符,包括套接字等)。
在fork()
調用中,孩子獲得了每個文件描述符的自己的單獨副本,每個文件描述符的行爲就像它們由dup()
創建的一樣。一個close()
只關閉已傳遞特定的文件描述符 - 因此,例如,如果你做n2 = dup(n); close(n);
,文件(管道,插座,設備...)這n
指的是保持開放 - 這同樣適用於文件由fork()
複製的描述。
......除非你用http://www.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html做一些技巧(你不應該這樣做) – ephemient 2010-03-11 21:46:22
當然,但是你發佈的不是'fork()',而是它的一個變體。 – pajton 2010-03-11 22:07:10
不,我的意思是'pthread_atfork'可以在'fork'時間將程序的動作改變爲(例如)包含關閉文件描述符。但是默認情況下,這並沒有發生,並且無論如何濫用該接口是一件奇怪的事情。 – ephemient 2010-03-11 22:20:46