文件描述符和分叉
當一個孩子被分叉時,它會繼承父母的文件描述符,如果孩子關閉文件描述符會發生什麼?如果孩子開始寫在父母的最後會發生什麼文件?誰來管理這些不一致,核心還是使用者?
當程序呼叫
close
函式通過文件描述符關閉特定打開的文件時。在程序的文件表中,引用計數減一。但是由於父母和孩子都持有同一個文件,所以引用計數為2,關閉後它減少到1。由於它不為零,因此程序仍然繼續使用文件沒有任何問題。請參閱 Terrence Chan UNIX 系統程式,(文件的 Unix 核心支持)。
當一個孩子被分叉時,它會繼承父母的文件描述符,如果孩子關閉文件描述符會發生什麼?
它繼承了文件描述符的*副本。*所以關閉子中的描述符將為子關閉它,但不是父,反之亦然。
如果孩子開始寫在父母的最後會發生什麼文件?誰來管理這些不一致,核心還是使用者?
它與寫入同一文件的兩個程序完全相同(如字面意思一樣)。核心獨立調度程序,因此您可能會在文件中獲得交錯的數據。
但是,POSIX(*nix 系統在很大程度上或完全符合)規定C API 中
read()
的write()
函式(映射到系統呼叫)是“相對於彼此的原子$$ … $$當它們對正常文件或符號連結進行操作時”。GNU C 手動還臨時承諾了關於管道的這一點(請注意,作為附帶條件的一部分,預設值
PIPE_BUF
是 64 kiB)。這意味著用其他語言/工具呼叫,例如使用echo
orcat
,應該包含在該契約中,因此如果兩個獨立的程序嘗試同時向同一個管道寫入“hello”和“world”,那麼另一端會出現“helloworld”或“worldhello” ,而且從來沒有像“hweolrllod”這樣的東西。當程序呼叫關閉函式通過文件描述符關閉特定打開的文件時。程序的文件表將引用計數減1。但是由於父子都持有同一個文件(引用計數為2,關閉後它減少到 1)因為它不是零,所以過程仍然繼續使用文件沒有任何問題。
有兩個程序,父程序和子程序。它們沒有共同的“引用計數”。他們是獨立的。WRT 當其中一個關閉文件描述符時會發生什麼,請參閱第一個問題的答案。