子プロセスが分岐すると、親プロセスのファイル記述子を継承します。子プロセスがファイル記述子を閉じるとどうなりますか?子が書き始めると、親側のファイルはどうなりますか?これらの矛盾を管理する人はカーネルですか、それともユーザーですか?
プロセスがclose
ファイル記述子を介して特定のファイルを閉じる関数を呼び出す場合。プロセスのファイルテーブルでは、参照数は1ずつ減少します。ただし、親プロセスと子プロセスの両方が同じファイルを保持しているため、参照数は2になり、終了後は1に減少します。ゼロではないため、プロセスは問題なくファイルを使用し続けます。
Terrence Chan UNIXシステムプログラミング(ファイルのUnixカーネルサポート)を参照してください。
答え1
子プロセスが分岐すると、親プロセスのファイル記述子を継承します。子プロセスがファイル記述子を閉じるとどうなりますか?
それは継承コピーファイル記述子。したがって、子の記述子を閉じると、子の記述子は閉じられますが、親の記述子は閉じられず、その逆も同様です。
子が書き始めると、親側のファイルはどうなりますか?これらの矛盾を管理する人はカーネルですか、それともユーザーですか?
両方のプロセスが同じファイルに書き込むのとまったく同じです(文字通り)。カーネルはプロセスを独立して予約するため、ファイルにインターリーブされたデータを取得できます。
しかし、POSIX(* nixシステムはほとんどまたは完全に互換性があります。)これは、C API(システムコールにマッピングされています)のread()
機能がwrite()
「通常のファイルまたはシンボリックリンク[...]で動作しているときに互いに原子的です」と述べています。 GNU Cマニュアルも一時的にパイプラインへの約束(デフォルトは手がかりPIPE_BUF
の一部である64kiBです。)これは他の言語/ツールへの呼び出しです(たとえば、What endをecho
使用するcat
プロセスがファイル記述子を介して開いている特定のファイルを閉じるためにclose関数を呼び出す場合。プロセスのファイルテーブルは参照数を1ずつ減らします。ただし、親プロセスと子プロセスの両方が同じファイルを保持しているため(参照数は2で閉じてから1ずつ減る)、ゼロではないため、プロセスはまだ問題なくファイルを使用し続けます。
親プロセスと子プロセスという2つのプロセスがあります。どちらにも共通の「参照回数」はありません。彼らは独立しています。 WRTファイル記述子の1つが閉じられたときに何が起こるのかについての最初の質問に対する答えを参照してください。
答え2
新しいサブプロセスが作成されるたびに、fork()
ファイル記述子はまったく保存されずに変更されます。
ファイルが重複しても、ファイル記述子は異なります。