6

マニュアルページで調べましたが、まだわかりません...

あなたが持っているとしましょうdup2(f1,0)。filedesc.1 を stdin に切り替えてから、stdin をロックしますか?

4

1 に答える 1

24

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);
于 2014-07-02T19:20:08.360 に答える