2010-03-11 47 views
7

當看到有關在UNIX環境高級編程管道,我注意到一個fork之後家長可以close()管道的讀端,並沒有關閉的讀端孩子。當進程分叉時,其文件描述符是否被保留?行爲的管道的()

我的意思是,在fork之前,管道讀取文件描述符的保留計數爲1,並且在fork 2之後。當父節點關閉它的讀取端時,fd轉到1並保持打開狀態兒童。這基本上是發生了什麼?這種行爲對於普通文件描述符是否也會發生?

回答

5

正如人們所瞭解fork()手冊頁上寫着:

子進程都有自己的父文件 描述符的副本。每個孩子的文件 描述應參照同一 打開文件的描述與 父的 相應的文件描述符。

所以是的,孩子有父母的文件描述符的確切副本,並指的是他們所有人,包括打開的文件。

+0

......除非你用http://www.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html做一些技巧(你不應該這樣做) – ephemient 2010-03-11 21:46:22

+0

當然,但是你發佈的不是'fork()',而是它的一個變體。 – pajton 2010-03-11 22:07:10

+0

不,我的意思是'pthread_atfork'可以在'fork'時間將程序的動作改變爲(例如)包含關閉文件描述符。但是默認情況下,這並沒有發生,並且無論如何濫用該接口是一件奇怪的事情。 – ephemient 2010-03-11 22:20:46

1

是的,分支複製所有打開的文件描述符。

因此,對於一個典型的管,2縫隙陣列(INT FD [2]),FD [0]是用於父和子相同,因此是FD [1]。

您可以在不分叉在所有創建管,並且通過使用FD [0]和FD [1]在一個過程中讀/寫給自己。

+1

通向令人敬畏的http://cr.yp.to/docs/selfpipe.html技巧! – ephemient 2010-03-11 21:45:51

2

答案是肯定的,是的(這同樣適用於所有文件描述符,包括套接字等)。

fork()調用中,孩子獲得了每個文件描述符的自己的單獨副本,每個文件描述符的行爲就像它們由dup()創建的一樣。一個close()只關閉已傳遞特定的文件描述符 - 因此,例如,如果你做n2 = dup(n); close(n);,文件(管道,插座,設備...)這n指的是保持開放 - 這同樣適用於文件由fork()複製的描述。