分岐したプロセス間でファイル記述子が共有されるのはなぜですか?

分岐したプロセス間でファイル記述子が共有されるのはなぜですか?

fork()プロセスの場合、子プロセスはファイル記述子を継承します。問題はなぜですか?

私がビューにファイル記述子を共有することは、各プロセスがr / wポインタの位置を追跡しようとしたときに面倒です。

このデザイン決定がなされたのはなぜですか?

ベストアンサー1

シェルの断片を考えてみましょう。

{ somecmd; othercommand *.txt; } > outputfile

リダイレクトが開始されると、シェルはoutputfile一度開き、ファイルハンドルをに渡して処理somecmdします。グループ化を考慮すると、ユーザーは両方のコマンドの出力が終了することを期待します。これはおそらく画面に表示されるのと同じように正しいでしょう。 (グループがシェルスクリプトの場合でも、状況は同じです。)othercmdforkoutputfile{ }

ファイルの場所がすべてのプロセスに対して独立している場合、出力はothercommand破損しますsomecmd。ファイルハンドルの位置がリセットされると、シェルはエンドを指すハンドルを渡すことforkができません(ファイルハンドルがファイルハンドルの後ろにあるため)。パイプを使用して2つのコマンドの出力を収集し(とにかく位置に依存しない)、他のプログラムから2つのコマンドの出力を接続する必要があります。othercommandoutputfilesomecmd

{ somecmd; othercommand *.txt } | cat > outputfile

おすすめ記事