親プロセスと子プロセスでディレクトリストリーム(DIR *)を閉じるのは安全ですか?

親プロセスと子プロセスでディレクトリストリーム(DIR *)を閉じるのは安全ですか?

このページ関数の保証された動作を説明し、readdirreaddir_rの文を含みます。

fork()を呼び出した後、親または子(両方ではない)はreaddir()、rewinddir()、またはeekdir()を使用してディレクトリストリームの処理を続行できます。親プロセスと子プロセスの両方がこれらの機能を使用している場合、結果は定義されません。

練習として関連機能系に対するフォーク安全ラッパーを作成していますが、これが親と子の両方のディレクトリストリームに同時に安全であるか、それともプロセスが安全かを知りたいとDIR*思います。closedirいいえディレクトリストリームから読み続ける場合は、ディレクトリストリームとまったく対話しないでください。

ベストアンサー1

一般的なコメントとして、以下を参照することをお勧めします。現在の説明readdir(ここでは何も変わりません)。

closedir実際には2つのことを行います。ディレクトリストリームを追跡するためにCライブラリによって割り当てられたメモリを解放し、//一連の関数がファイルディスクリプタを使用opendirして実装されている場合は、ファイルディスクリプタを閉じますreaddirclosedirどちらの操作も、デフォルトの親または子プロセスではなく、それを呼び出すプロセスに適用されますfork。ディレクトリストリームを解放すると、呼び出しプロセスのメモリにのみ影響します(必要に応じて、プロセスの変更に関係なく操作するために関連ページのコピーを作成します)。書き込み時にコピーの共有メモリマッピングを持つプロセスfork)、ファイルディスクリプタを閉じることは現在のプロセスにのみ影響します(他のプロセスにデフォルトのファイル記述を共有するファイル記述子がある場合、ファイル記述は解放されません)。

したがって、readdir共有ディレクトリストリームの他のプロセスから呼び出すことは安全ではありませんが(デフォルトの共有ファイルの説明のために)closedir安全です。

おすすめ記事