Linux文件共享(四)——父進程與子進程之間的文件共享
注:轉載請注明出處 作者:lvyilong316
由fork產生的進程為子進程。fork的一個特性是父進程所有的打開文件描述符(file_struct)都被複製到子進程中,父子進程的每個相同的打開描述符共享一個文件表項如圖。
在linux係統中的具體實現可用下圖表示(說明:進程的fs_struct也會被複製,圖中沒有畫出)。
這種共享的方式使父、子進程對同一個文件使用了同一個文件偏移量。如果父、子進程寫到同一個文件描述符,但有沒有任何形式的同步,那麼它們的輸出就會相互混合。在fork之後處理文件描述符有兩種常見的情況:
(1)父進程等待子進程完成。在這種情況下,父進程無須對其描述符做任何處理。當子進程終止之後,它曾進行過讀、寫的人一個共享描述符的文件偏移量已經執行了相應的更新。
(2)父、子進程各自執行不同的程序段。這種情況下,在fork之後,父、子進程各自關閉它們不需使用的文件描述符,這樣就不會幹擾對方使用的文件描述符。這種方式是網絡服務進程中常用的方式。
總結:父子進程共享“文件表項”(file對象),同dup一樣,這會增加“文件達開計數”(file對象的引用計數),隻不過fork增加的引用計數來自不同進程(父進程和子進程)中的描述符,dup增加的引用來自同一文件描述符。但父子進程獨立運行後再打開的文件就不在共享file對象,這個兩個獨立進程打開文件情況一樣。父子進程傳遞文件描述符和兩獨立進程傳遞描述符性質一樣。
注:文件表項隻有在所有引用它的fd(即文件描述符)全部關閉的情況下才會真正關閉。所以如上述情況,如果子進程關閉父、子進程共享的文件描述符後父進程仍可以使用對應的文件表項。
最後更新:2017-04-03 12:56:03