0

1.このコードで何が起こるか:

 close(0)

今、入力を読み取る方法はありませんか?

2.これはどうですか:

close(0)
dup(1)

標準出力からの入力だと思いますが、どういう意味ですか?

4

2 に答える 2

1

これは、ファイル記述子0でstdoutを開いていることを意味します。そのファイル記述子から読み取ることができるかどうかは、stdoutが実際に何であるかによって異なります。stdoutが入力機能と出力機能の両方を備えた端末(または疑似端末)である場合は、それを読み取ることができる場合があります。stdoutが、プログラムを開始したシェルが書き込み専用モードで開いたファイルである場合、それを読み取ることができない可能性があります。

いずれにせよ、特定の動作に依存するべきではありません。これを行った後、ファイル記述子0から読み取ることができると期待すべきではありません。

于 2012-07-24T16:24:39.107 に答える
0
  1. 入力を読み取る方法がないようです。stdinただし、たまたまそのような状況を予測した場合は、次のように記述子を「保存」できます。

    int stdin_save;
    ...
    stdin_save = dup(0);
    ...
    close(0); // Here it is "impossible" to read input
    ...
    dup(stdin_save); // Possible to read input again!
    
  2. Eric Postpischilによって説明されstdoutているように、ファイル/デバイスに読み取り/書き込み方法で接続されている場合(端末では一般的です)、実行後dup(1)、通常の読み取り機能が復元されます。しかし、異常なことは何も起こりません (プログラムが自分自身に話しかけるなど)。

于 2012-07-24T17:42:58.347 に答える