Kernel

fork() 是否還會複製呼叫程序目前正在執行的可執行二進製文件的文件描述符?

  • November 8, 2020

我已經閱讀了 fork() 上的手冊頁,他們說了一些類似於“在呼叫程序中打開的所有文件描述符都被複製”的內容。

我不是 100% 清楚呼叫程序在該時間點執行的可執行二進製文件的文件描述符是否包含在該語句中。我知道手冊頁說“所有文件描述符”,但我問這個是因為open()對於分叉程序的相同可執行二進製文件對我來說似乎更容易,而不是同步使用它們的兩個程序。所以如果它們確實也被複製了,為什麼?

正在執行的二進製文件沒有文件描述符,只有記憶體映射。

(參見,例如ls -l /proc/self/fdcat /proc/self/maps在 Linux 上。)

當然,記憶體映射將指向同一個文件,但共享庫也會發生這種情況。對於主程序文件,在 Linux 上,不允許在正在執行的程序使用它時對其進行寫入。(雖然我上次檢查時,這不適用於共享庫。)

目前尚不清楚您實際上要做什麼,但在 Linux(和其他一些系統)上,您可以使用open("/proc/self/exe", ...). 即使文件已被刪除或文件系統中從未存在過,這也將起作用。

就像/dev/tty(它將始終打開呼叫程序的控制 tty - 如果有的話),/proc/self/exe將始終打開呼叫程序目前正在執行的文件。它們都充當隱藏已被程序引用的打開文件描述的“門”,允許像普通文件一樣訪問它們。

這些幾乎不是程序擁有的唯一“隱藏”/潛在文件描述符。特別是,您可以使用創建文件的記憶體映射mmap(..., fd, ...),然後關閉fd不會刪除該映射,並且您的程序仍將保留對該文件的引用,就像文件描述符一樣(在 Linux 上,您可以將其轉回通過打開/proc/self/map_files/<range>)進入文件描述符。


/proc/self/{cwd,root}其他範例是根目錄和目前工作目錄(目錄,您可以通過仍然打開的文件描述符繼續將數據寫入已刪除文件的方式。

引用自:https://unix.stackexchange.com/questions/618528