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


14

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

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

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


さて、最後のコメントを気にしない;のmanページでは)open()fork()の区別があり、ファイルDESCRIPT-かファイルdesciptイオン -前者は、後を指す、とフォークで記述子がコピーされているものの、それらは同じ説明を参照します。ただし、テストした場合、これが明らかなのは、子のハンドルを閉じると親のハンドルが閉じることではありません。両方のハンドルが書き込みを行うと、データのインターリーブに微妙な違いが生じる可能性があると思いますが、いずれにしても不確定なので、正確にどのように発生するかはそれほど重要ではありません。
goldilocks 2013

回答:


28

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

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

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

これは、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つがファイル記述子を閉じるとどうなるか、最初の質問への回答を参照してください。


1

fork()新しい子を作るときはいつでも、ファイル記述子はまったく保持されません-それらは変更されます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.