web-dev-qa-db-ja.com

ファイル記述子とフォーク

子がフォークされると、子は親のファイル記述子を継承します。子がファイル記述子を閉じるとどうなりますか?子供が書き込みを開始した場合、親の最後でファイルはどうなりますか?これらの不整合を管理するのは、カーネルまたはユーザーですか?

プロセスがclose関数を呼び出して、ファイル記述子を通じて特定の開いているファイルを閉じるとき。プロセスのファイルテーブルでは、参照カウントが1つ減少します。しかし、親と子の両方が同じファイルを保持しているため、参照カウントは2になり、クローズ後は1に減少します。ゼロではないため、プロセスは問題なくファイルを引き続き使用します。

Terrence Chan UNIXシステムプログラミング(ファイルのUNIXカーネルサポート)を参照してください。

14
Madan Ram

子がフォークされると、親のファイル記述子を継承します。子がファイル記述子を閉じるとどうなりますか?

ファイル記述子のcopyを継承します。したがって、子の記述子を閉じると、子では閉じられますが、親では閉じられません。逆も同様です。

子供が書き込みを開始した場合、親の最後でファイルはどうなりますか?これらの不整合を管理するのは誰ですか、カーネルまたはユーザーですか?

これは、2つのプロセスが同じファイルに書き込むのとまったく同じです(文字どおり正確に)。カーネルはプロセスを個別にスケジュールするため、ファイルにインターリーブされたデータを取得する可能性があります。

ただし、 [〜#〜] posix [〜#〜] (* nixシステムがほぼまたは完全に準拠する)は、read()およびwrite()関数がC APIから(システムコールにマップされます)は、「通常のファイルまたはシンボリックリンクを操作するとき、互いにアトミック[...]です」。 GNU Cも手動で暫定的に パイプに関してこれを約束します (ただし、ただし書きの一部であるデフォルトのPIPE_BUFは64 kiBです)。つまり、echocatの使用など、他の言語/ツールでの呼び出しは、そのコントラクトに含まれる必要があるため、2つの独立したプロセスが「hello」と「world」を書き込もうとすると同じパイプに対して同時に、もう一方の端は「helloworld」または「worldhello」のいずれかであり、「hweolrllod」のようなものは決してありません。

プロセスがファイル記述子を介して特定の開いているファイルを閉じるためにclose関数を呼び出すとき。プロセスのファイルテーブルは、参照カウントを1つ減らします。ただし、親と子の両方が同じファイルを保持しているため(参照カウントは2であり、閉じた後は減少します) to 1)ゼロではないので、プロセスは問題なくファイルを使用し続けます。

親と子の2つのプロセスがあります。両方に共通する「参照カウント」はありません。それらは独立しています。 WRTの1つがファイル記述子を閉じたときに何が起こるかについては、最初の質問に対する回答を参照してください。

26
goldilocks

fork()が新しい子を作成するたびに、ファイル記述子はまったく保持されず、変更されます。

ファイルは重複しますが、ファイル記述子が異なります。

1
mannukaushikece