dupを使用してSTDOUTをパイプにリダイレクトする場合、次のようにします。
close(1); dup(fd[1]);
close(fd[0]);
close(fd[1]);
execlp("ls","-al",(char *) NULL);
しかし、パイプの両端を閉じています。では、STDOUTをパイプに書き込むにはどうすればよいでしょうか。
ファイル記述子番号1(たとえば、標準出力)が閉じられると、その番号はそれ以降dup
またはopen
呼び出しに使用できるようになります。
close
とdup
syscallの結果を確認する必要があります。
もちろん、パイプの両端を閉じることは、前に何か便利なことをしない限り(つまり、適切な端で読み取りまたは書き込みを行う場合)、意味がありません。
open(2)、dup(2)、pipe(2)、close(2)のマニュアルページを参照してください。AdvancedLinuxProgrammingの本を読んでください。
サンプルコードでは、パイプの両端を閉じていません。あなたは閉じていますfd[0]
そしてfd[1]
。最初は、それらを閉じるだけでパイプの両端を閉じることができましたが、複製した後ではありませんfd[0]
。パイプへのすべての参照を閉じるには、複製されたfdも閉じる必要があります。しかし、それはばかげているでしょう。lsが書き込めるように、端を正確に開いたままにしているのです。
おそらくあなたの混乱はclose()
終わりについてですか?パイプの一方の端への参照であるfdを閉じます。それはパイプ自体を閉じません:それは何shutdown()
をするかです。(shutdownを呼び出さない場合、パイプを参照するすべてのfdが閉じられると、パイプは自動的に閉じられます。)したがって、複製されたfdはまだ開いているため、プロセスはパイプに書き込むことができます(パイプは閉じられていません。それへの3つの参照のうち2つだけが閉じられました)。