Posix
在父程序和子程序中關閉目錄流(DIR *)是否安全?
此頁面描述了函式的保證行為,
readdir
並readdir_r
包含以下句子:在呼叫 fork() 之後,父或子(但不是兩者)可以繼續使用 readdir()、rewinddir() 或 seekdir() 處理目錄流。如果父程序和子程序都使用這些函式,則結果未定義。
我正在圍繞
DIR*
-related 函式係列編寫一個 fork-safe 包裝器作為練習,我想知道它是否closedir
同時對父級和子級中的目錄流是安全的,或者不繼續讀取的程序是否從目錄流根本不應該與目錄流互動。
作為一般性評論,我建議參考目前的描述
readdir
(它不會在這裡改變任何東西)。
closedir
在實踐中做了兩件事:它釋放 C 庫分配的記憶體來跟踪目錄流,如果opendir
//readdir
系列closedir
函式是使用文件描述符實現的,它會關閉文件描述符。這兩個操作都適用於呼叫它們的程序,而不是潛在的父程序或子程序fork
:釋放目錄流只會影響呼叫程序的記憶體(如有必要,創建相關頁面的副本以獨立於任何頁面進行更改)其他程序具有來自寫時複製的共享記憶體映射fork
),並且關閉文件描述符僅影響目前程序(如果另一個程序具有共享底層文件描述的文件描述符,則不會釋放文件描述)。因此,雖然
readdir
從共享目錄流上的不同程序呼叫是不安全的(因為底層共享文件描述),但closedir
它是安全的。