Posix

在父程序和子程序中關閉目錄流(DIR *)是否安全?

  • March 22, 2019

此頁面描述了函式的保證行為,readdirreaddir_r包含以下句子:

在呼叫 fork() 之後,父或子(但不是兩者)可以繼續使用 readdir()、rewinddir() 或 seekdir() 處理目錄流。如果父程序和子程序都使用這些函式,則結果未定義。

我正在圍繞DIR*-related 函式係列編寫一個 fork-safe 包裝器作為練習,我想知道它是否closedir同時對父級和子級中的目錄流是安全的,或者繼續讀取的程序是否從目錄流根本不應該與目錄流互動。

作為一般性評論,我建議參考目前的描述readdir(它不會在這裡改變任何東西)。

closedir在實踐中做了兩件事:它釋放 C 庫分配的記憶體來跟踪目錄流,如果opendir//readdir系列closedir函式是使用文件描述符實現的,它會關閉文件描述符。這兩個操作都適用於呼叫它們的程序,而不是潛在的父程序或子程序fork:釋放目錄流只會影響呼叫程序的記憶體(如有必要,創建相關頁面的副本以獨立於任何頁面進行更改)其他程序具有來自寫時複製的共享記憶體映射fork),並且關閉文件描述符僅影響目前程序(如果另一個程序具有共享底層文件描述的文件描述符,則不會釋放文件描述)。

因此,雖然readdir從共享目錄流上的不同程序呼叫是不安全的(因為底層共享文件描述),但closedir它是安全的。

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