ファイルディスクリプタの複製に関して、dup() 関数の本当に馬鹿げた説明を得ることができますか? パイプを使いたいのですが、パイプから読み取るように子を作成する必要があります(これは簡単な部分です)が、データを親に書き戻します。別のパイプを使用する必要がありますか、それとも同じパイプを使用できますか?
2 に答える
dup() (および dup2() と dup3()) は、重複したファイル記述子を作成します。
1 つの引数 dup() を使用すると、OS は空いているファイル記述子番号を選択し、渡されたものの複製を作成します。
int dup_of_fd = dup(int fd);
2 つの引数 dup2() を使用すると、複製として使用するファイル記述子番号を指定する以外はまったく同じです。すでに使用されている場合 (この例では 10 が既に使用されている場合)、それ (ここでは 10) が閉じられ、複製として再度開かれます。
int dup_of_fd = dup2(fd, 10);
3 つの引数 dup3() (Linux 固有) を使用すると、フラグ/オプションを渡すことができることを除いて、dup2() と同じです。
いずれの場合も、新しい (複製された) ファイル記述子は古いものとは異なる番号になりますが、両方からの読み取りまたは書き込みはまったく同じになります。
2 つの複製されたファイル記述子から読み取る場合、シーク位置は共有されるため、ファイルを開いて fd を dup_of_fd として複製すると、fd から 10 バイトを読み取り、次に dup_of_fd から 10 バイトを読み取ると、dup_of_fd から読み取られるバイトはバイト 11 になります。そのファイル記述子番号からの最初の読み取りであっても、20 まで。
マニュアルページから:
dup() システム コールは、ファイル記述子 oldfd のコピーを作成し、未使用の最も小さい番号の記述子を新しい記述子に使用します。
エイリアスの作成と考えることができます。呼び出しが成功すると、同じリソース (ファイル、パイプ、またはその他のもの) を参照する2 つのファイル記述子が作成されます。
パイプを介して子プロセスと通信するユースケースでは、を使用する必要はありませんdup
。あなたがする必要があるのは、 pipe、forkを呼び出し、子プロセスと親プロセスでパイプの未使用の端を閉じることだけです。