POSIX スレッドは実際には特に関係がないfork
ため、スレッドではなくプロセスについて話していると思います。スレッドでは、親と子の概念がなく、両方が同じデータを共有します。
プロセスの場合、すべてのプロセスには、固有のファイル記述子の独自のセットがあり、負でない小さい数です ( C の概念であるファイルハンドルではありません)。
ただし、これらのファイル記述子はすべて、共有プール (カーネル内など) 内のエントリを指しています。これにより、すべてのプロセスが独自の標準入力、出力、およびエラー (記述子 0、1、および 2) を持つことができますが、同じ「バッキング ファイル」を参照する可能性があります。
そのため、プロセスが fork すると、独自のファイル記述子を取得しますが、それらは親と同じ共有プール エントリを指します。
その後、子がそのファイル記述子を閉じて、別の場所を指すように再度開いた場合、それは親ではなく子にのみ影響します。
したがって、2 つのフォークの結果として 3 つのプロセスがあり、プロセス C がファイルに移動するために標準出力を閉じてから再度開いたとします。これは、現在の状況に関する (一種の) グラフィック表示です。
Individual processes Shared pool
+------+ +------------------+
Process A | fd 1 | ----+----> | maps to /dev/tty |
+------+ | +------------------+
Process B | fd 1 | ----+
+------+ +------------------+
Process C | fd 1 | ---------> | maps to new file |
+------+ +------------------+
この動作は、3 つの標準ディスクリプタに固有のものではなく、すべてに適用されます。実際、記述子は だけでなく、fork
(通常) にも存続しexec
、UNIX ライクなオペレーティング システムでリダイレクションを機能させるものです。で自動的に閉じたい場合は、記述子を明示的にマークする必要がありますexec
。