1.このコードで何が起こるか:
close(0)
今、入力を読み取る方法はありませんか?
2.これはどうですか:
close(0)
dup(1)
標準出力からの入力だと思いますが、どういう意味ですか?
1.このコードで何が起こるか:
close(0)
今、入力を読み取る方法はありませんか?
2.これはどうですか:
close(0)
dup(1)
標準出力からの入力だと思いますが、どういう意味ですか?
これは、ファイル記述子0でstdoutを開いていることを意味します。そのファイル記述子から読み取ることができるかどうかは、stdoutが実際に何であるかによって異なります。stdoutが入力機能と出力機能の両方を備えた端末(または疑似端末)である場合は、それを読み取ることができる場合があります。stdoutが、プログラムを開始したシェルが書き込み専用モードで開いたファイルである場合、それを読み取ることができない可能性があります。
いずれにせよ、特定の動作に依存するべきではありません。これを行った後、ファイル記述子0から読み取ることができると期待すべきではありません。
入力を読み取る方法がないようです。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!
Eric Postpischilによって説明されstdout
ているように、ファイル/デバイスに読み取り/書き込み方法で接続されている場合(端末では一般的です)、実行後dup(1)
、通常の読み取り機能が復元されます。しかし、異常なことは何も起こりません (プログラムが自分自身に話しかけるなど)。