1. ホーム
  2. c

[解決済み] C言語でdup2()は何をするのか

2022-03-05 21:49:28

質問

マニュアルで調べたのですが、まだよくわかりません...。

例えば、次のようなものがあるとします。 dup2(f1,0) . これは filedesc.1 を stdin で切り替えて、stdin をロックしているのでしょうか?

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

dup2 はファイルディスクリプタを入れ替えるのではなく、同等にするのです。その後 dup2(f1, 0) でオープンされたファイルは、ディスクリプタ f1 は、ディスクリプタ0、すなわち標準入力上でも(同じモードと位置で)開かれるようになりました。

対象のファイルディスクリプタ(ここでは0)が開かれていた場合、それを閉じるために dup2 の呼び出しがあります。このように

before                         after
0: closed, f1: somefile        0: somefile, f1:somefile
0: otherfile, f1: somefile     0: somefile, f1:somefile

ロックはしません。

dup2 は、標準的なファイル記述子から読み書きをするプログラムの一部がある場合に(特に)便利です。例えば、以下のように仮定します。 somefunc() は標準入力から読み込みますが、プログラムの残りの部分が標準入力を得ている場所とは異なるファイルから読み込むようにしたい場合。それなら、こうすればいい(エラーチェックは省略)。

int save_stdin = dup(0);
int somefunc_input_fd = open("input-for-somefunc.data", O_RDONLY);
dup2(somefunc_input_fd, 0);
/* Now the original stdin is open on save_stdin, and input-for-somefunc.data on both somefunc_input_fd and 0. */
somefunc();
close(somefunc_input_fd);
dup2(save_stdin, 0);
close(save_stdin);