2010-11-24 8 views
13

StevensのUNIXネットワークプログラミングでは、デーモンを設定するときに必要なstdin、stdout、およびstderrのリダイレクトについて言及しています。彼は、次のCコードSTDIN、STDOUT、STDERRをCの/ dev/nullにリダイレクトする

/* redirect stdin, stdout, and stderr to /dev/null */ 
open("/dev/null", O_RDONLY); 
open("/dev/null", O_RDWR); 
open("/dev/null", O_RDWR); 

私はこれら三つのは、彼らが* 3、STDをリダイレクトしている「知っている」はどのように混乱しているとそれをしません。特に、最後の2つのコマンドが同じであるためです。誰かが正しい方向に私を説明したり指摘したりすることができますか?

+2

Tch。このようにするのは危険です。常に 'dup2()'を使用してください。 –

+2

あなたのプロセスがシングルスレッドで、古いstdin/out/errをすでに閉じている場合は危険ではありません。 –

+0

この回答は何らかの助けになるかもしれません:http://stackoverflow.com/a/4973065/207753 – SlappyTheFish

答えて

12

このコードが実行されると、ファイル記述子0,1、および2はすでに閉じられており、新しいファイル記述子を割り当てる他のスレッドは存在しない可能性があります。この場合、使用可能な最も低いファイル記述子番号を常に割り当てるにはopenが必要なので、openに3回コールすると、失敗しない限り、ファイル記述子0,1、および2が生成されます。

+0

彼は 'O_WRONLY'の代わりに' O_RDWR'を選んだ理由は何ですか? –

+0

ファイルディスクリプタの順序はstdin、stdout、stderrです。もちろん、標準入力は読み込み専用です。 – slezica

+0

確かにstdoutとstderrは 'O_WRONLY'を開くことができましたが、私は本当に重要ではないと思っています... –

3

ファイル記述子0,1,2はそれぞれ入力、出力、エラーであり、openは利用可能な最初のファイル記述子を取得するためです。これは、ファイル記述子0,1,2がまだ使用されていない場合にのみ機能することに注意してください。

そして、あなたが使用する用語について注意しなければならないものと、ファイル記述子との間に相関関係があるものの、stdinstdoutstderrは実際、むしろファイルディスクリプタよりもハンドル(FILE*)を提出しています。

関連する問題