「Unix環境での高度なプログラミング」、第2版、W。リチャードスティーブンス著。セクション8.3フォーク機能。
説明は次のとおりです。
親と子が同じファイルオフセットを共有することが重要です。
子供をフォークし、子供が完了するのを待つプロセスを考えてみましょう。両方のプロセスが通常の処理の一部として標準出力に書き込むと想定します。親の標準出力が(おそらくシェルによって)リダイレクトされている場合、子が標準出力に書き込むときに、親のファイルオフセットが子によって更新されることが不可欠です。
私の回答:
{1}それはどういう意味ですか?たとえば、親のstd出力が「file1」にリダイレクトされる場合、子が書き込んだ後に子は何を更新する必要がありますか?親の元の標準出力オフセットまたはリダイレクトされた出力(つまりfile1)オフセット?遅くなることはできませんよね?
{2}更新はどのように行われますか?子によって明示的に、OSによって暗黙的に、ファイル記述子自体によって?フォークした後、私は親と子が独自の方法でファイル記述子の独自のコピーを持っていると思いました。では、子はどのように親側へのオフセットを更新しますか?
この場合、親が待機している間、子は標準出力に書き込むことができます。子が完了すると、親は標準出力への書き込みを続行でき、その出力は子が書き込んだものに追加されることを知っています。親と子が同じファイルオフセットを共有していなかった場合、このタイプの対話は実行がより困難になり、親による明示的なアクションが必要になります。
親と子の両方が、親に子を待機させるなど、同期の形式なしで同じ記述子に書き込む場合、それらの出力は混合されます(フォークの前に開いていた記述子であると想定)。これは可能ですが、通常の動作モードではありません。
フォークの後に記述子を処理する通常のケースは2つあります。
親は子が完了するのを待ちます。この場合、親は記述子に対して何もする必要はありません。子が終了すると、子が読み取りまたは書き込みを行った共有記述子のいずれかで、それに応じてファイルオフセットが更新されます。
親と子の両方が独自の道を進みます。ここで、フォークの後、親は必要のない記述子を閉じ、子は同じことを行います。このように、どちらも相手のオープン記述子に干渉しません。このシナリオは、ネットワークサーバーの場合によくあります。
私の反応:
{3} fork()が呼び出されると、私が理解しているのは、子が親が持っているもの(この場合はファイル記述子)のコピーを取得し、その処理を実行することだけです。親と子が共有するファイル記述子にオフセットが変更された場合、それは記述子がオフセット自体を記憶しているためにのみ発生する可能性があります。私は正しいですか?
私はその概念に少し慣れていません。