
このページ関数の保証された動作を説明し、readdir
次readdir_r
の文を含みます。
fork()を呼び出した後、親または子(両方ではない)はreaddir()、rewinddir()、またはeekdir()を使用してディレクトリストリームの処理を続行できます。親プロセスと子プロセスの両方がこれらの機能を使用している場合、結果は定義されません。
練習として関連機能系に対するフォーク安全ラッパーを作成していますが、これが親と子の両方のディレクトリストリームに同時に安全であるか、それともプロセスが安全かを知りたいとDIR*
思います。closedir
いいえディレクトリストリームから読み続ける場合は、ディレクトリストリームとまったく対話しないでください。
答え1
一般的なコメントとして、以下を参照することをお勧めします。現在の説明readdir
(ここでは何も変わりません)。
closedir
実際には2つのことを行います。ディレクトリストリームを追跡するためにCライブラリによって割り当てられたメモリを解放し、//一連の関数がファイルディスクリプタを使用opendir
して実装されている場合は、ファイルディスクリプタを閉じますreaddir
。closedir
どちらの操作も、デフォルトの親または子プロセスではなく、それを呼び出すプロセスに適用されますfork
。ディレクトリストリームを解放すると、呼び出しプロセスのメモリにのみ影響します(必要に応じて、プロセスの変更に関係なく操作するために関連ページのコピーを作成します)。書き込み時にコピーの共有メモリマッピングを持つプロセスfork
)、ファイルディスクリプタを閉じることは現在のプロセスにのみ影響します(他のプロセスにデフォルトのファイル記述を共有するファイル記述子がある場合、ファイル記述は解放されません)。
したがって、readdir
共有ディレクトリストリームの他のプロセスから呼び出すことは安全ではありませんが(デフォルトの共有ファイルの説明のために)closedir
安全です。