子がフォークされた場合、子は親のファイル記述子を継承します。子がファイル記述子を閉じるとどうなりますか?
ファイル記述子のコピーを継承します。したがって、子の記述子を閉じると、子では閉じられますが、親では閉じられません。逆も同様です。
子供が書き込みを開始した場合、親の最後でファイルはどうなりますか?これらの不整合を管理するのは誰ですか、カーネルまたはユーザーですか?
これは、2つのプロセスが同じファイルに書き込むのとまったく同じです(文字どおり正確に)。カーネルはプロセスを個別にスケジュールするため、ファイルにインターリーブされたデータを取得する可能性があります。
しかし、POSIX(* nixシステムは、主にまたは完全に準拠した)、と規定しているread()
とwrite()
[...]彼らは通常のファイルを操作するCのAPI(システムコールへのマップ)から関数が互いに「アトミックですかシンボリックリンク」。また、GNU Cはパイプに関してこれを暫定的に暫定的に約束します(PIPE_BUF
ただし、ただし書きの一部であるデフォルトは64 kiBです)。これは、echo
またはの使用など、他の言語/ツールでの呼び出しがcat
そのコントラクトに含まれる必要があることを意味します。したがって、2つの独立したプロセスが「hello」と「world」を同時に同じパイプに書き込もうとすると、他のものが出てきますendは「helloworld」または「worldhello」のいずれかであり、「
プロセスがファイル記述子を通じて特定の開いているファイルを閉じるためにclose関数を呼び出すとき。プロセスのファイルテーブルは、参照カウントを1だけ減らします。 1)まではゼロではないため、プロセスは問題なくファイルを引き続き使用します。
親と子の2つのプロセスがあります。両方に共通する「参照カウント」はありません。それらは独立しています。WRTの1つがファイル記述子を閉じるとどうなるか、最初の質問への回答を参照してください。
open()
とfork()
の区別があり、ファイルDESCRIPT-かとファイルdesciptイオン -前者は、後を指す、とフォークで記述子がコピーされているものの、それらは同じ説明を参照します。ただし、テストした場合、これが明らかなのは、子のハンドルを閉じると親のハンドルが閉じることではありません。両方のハンドルが書き込みを行うと、データのインターリーブに微妙な違いが生じる可能性があると思いますが、いずれにしても不確定なので、正確にどのように発生するかはそれほど重要ではありません。