1

私は C でのプロセス使用の初心者です。子プロセスでのファイル記述子の Linux の動作に関連する質問があります。

ファイル記述子が子プロセスと親プロセスの間で共有されているという情報、および番号0、1、2のファイル記述子が標準入力出力とエラーであるという情報を見つけたので、プロセスをフォークすると同じになると思いました入力および出力ディレクトリですが、子プロセスで変更しても、親プロセスでは変更されません。私の質問は、それはすべてのファイル記述子で機能するので、子プロセスでファイル記述子番号100を上書きすると決めた場合、子と親で異なるか、ファイル記述子0、1、2のみが特別と見なされます。

よろしくお願いします

4

3 に答える 3

7

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

于 2013-06-14T03:11:04.103 に答える
1

子プロセスはの時点で親の開いているファイル テーブルのコピーfork()を取得しますが、その時点以降、親または子のいずれかの変更 (たとえば、新しいファイル記述子を開いたり、既存のファイル記述子を閉じたり) は、他方には反映されません。この点に関して、ファイル記述子 0、1、および 2 について特別なことは何もありません。

ただし、開いているファイル テーブル (ファイル記述子のセット) がコピーされても、それらの記述子によって参照される開いているファイルはコピーされないことに注意してください。これは、開いているファイルへの更新 (たとえば、現在のファイル位置を で変更するlseek()) が両方のプロセスに影響することを意味します。

スレッドの場合は別の問題です。同じプロセス内のスレッドは同じ開いているファイル テーブルを共有するため、1 つのスレッドの変更はすべてのスレッドに表示されます。ここでも、ファイル記述子 0、1、および 2 について特別なことは何もありません。

于 2013-06-14T03:18:37.230 に答える
1

ファイル記述子は、配列へのインデックスと考えることができます。したがって、標準入力/出力/エラーの記述子について特別なことは何もありません。

プロセスを分岐すると、これらの配列が 2 つになり、1 つは親用、もう 1 つは子用になります。コピーされているため、最初はどちらも同じですが、異なるプロセスが他のファイル記述子を開いたり閉じたりし始めると、それらは分岐し始めます。

于 2013-06-14T03:11:03.007 に答える