全体的な状況を理解するためにファイル記述子を使用しようとしています。最初に、次のファイル記述子を持つprocess1があるとします。
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
次に、ファイル記述子 1 を閉じます。
close(1);
ファイル記述子1は標準出力に変換(指定)します。ファイル構造カーネルからファイルテーブルを開く。
上記のコードを使用すると、ファイル記述子1がプロセステーブルから削除され、次のようになります。
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
しかし、カーネルでは何が起こりますか? FILE構造がstdout
解放されましたか? stdoutが特別なファイル(モニター)であり、他のプロセスで使用できる場合はどうすればよいですか? FILE構造が通常のファイル(例:.txt)の場合はどうなりますか?他のプロセスがそのようなファイルを使用している場合はどうなりますか?
ベストアンサー1
ファイル記述子1は、カーネルのオープンファイルテーブルからstdout FILE構造に変換されます。
これは誤解です。カーネルのファイルテーブルは、ユーザ空間ファイル構造とは何の関係もありません。
とにかく、カーネルには2つのレベルの間接参照があります。参照計算されるファイル自体を表す内部構造があります。参照回数が計算される「オープンファイル記述」があります。その後、参照計算されないファイルハンドルがあります。ファイル構造はinode自体を指します。オープンファイルの説明には、オープンモードとファイルポインタが含まれます。
クローズを呼び出すと、常にファイルハンドルを閉じます。ファイルハンドルが閉じると、開かれたファイル記述の参照回数が減少します。 0になると、開いたファイル記述も解除され、ファイル自体の参照回数が減ります。この値が 0 になると、カーネルのファイル構造が解放されます。
共有リソースは参照計算されるため、あるプロセスは別のプロセスで使用されているリソースを解放する機会がありません。