1. ホーム
  2. c

[解決済み] dup2 / dup - なぜファイルディスクリプタを複製する必要があるのでしょうか?

2023-03-24 19:56:05

疑問点

の使い方を理解しようとしています。 dup2dup .

man ページから :

DESCRIPTION

dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may
be used interchangeably. They share locks, file position pointers and
flags; for example, if the file position is modified by using lseek on
one of the descriptors, the position is also changed for the other.

The two descriptors do not share the close-on-exec flag, however.

dup uses the lowest-numbered unused descriptor for the new descriptor.

dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.  

RETURN VALUE

dup and dup2 return the new descriptor, or -1 if an error occurred 
(in which case, errno is set appropriately).  

なぜそのようなシステムコールが必要なのでしょうか? ファイルディスクリプタを複製することに何の意味があるのでしょうか?

ファイル記述子があるのなら、なぜそのコピーを作りたいのでしょうか?

私はあなたが説明し、私に例を与えることができれば感謝します。 dup2 / dup が必要です。

ありがとうございます

どのように解決するのですか?

dup システムコールは、既存のファイル記述子を複製し、同じ基礎となる I/O オブジェクトを参照する新しいものを返します。 同じ基礎となる I/O オブジェクトを参照します。

Dup は、シェルがこのようなコマンドを実装することを可能にします。

ls existing-file non-existing-file > tmp1  2>&1

2>&1 は、シェルに、コマンドに、記述子 1 の複製であるファイル記述子 2 を与えるように指示します。(すなわち、stderr と stdout は同じ fd を指す)。

ここで ls を呼び出した場合のエラーメッセージです。 存在しないファイル という正しい出力と ls 既存のファイル で表示されます。 tmp1 ファイルに表示されます。

次のサンプルコードは、標準入力がパイプの読み込み側に接続された状態で、プログラムwcを実行します。 をパイプの読み込み側に接続して実行します。

int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if(fork() == 0) {
    close(STDIN); //CHILD CLOSING stdin
    dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)
    close(p[STDIN]);
    close(p[STDOUT]);
    exec("/bin/wc", argv);
} else {
    write(p[STDOUT], "hello world\n", 12);
    close(p[STDIN]);
    close(p[STDOUT]);
}

子は読み込み終了をファイル記述子 0 にダンプし、p のファイル記述子を閉じます。 スクリプタを閉じ、wc を実行する。wc が標準入力から読み込むとき、それはパイプから読み込む。 パイプから読み込む。

これは、パイプがdupを使用して実装されている方法です。さて、dupの1つの使用は、他の何かを構築するためにパイプを使用して、システムコールの美しさです。 最終的には、システムコールはカーネルで得られる最も基本的なツールです。

乾杯 :)