1

dupを使用してSTDOUTをパイプにリダイレクトする場合、次のようにします。

close(1); dup(fd[1]);
close(fd[0]);
close(fd[1]);
execlp("ls","-al",(char *) NULL);

しかし、パイプの両端を閉じています。では、STDOUTをパイプに書き込むにはどうすればよいでしょうか。

4

2 に答える 2

1

ファイル記述子番号1(たとえば、標準出力)が閉じられると、その番号はそれ以降dupまたはopen呼び出しに使用できるようになります。

closedupsyscallの結果を確認する必要があります。

もちろん、パイプの両端を閉じることは、前に何か便利なことをしない限り(つまり、適切な端で読み取りまたは書き込みを行う場合)、意味がありません。

open(2)dup(2)pipe(2)close(2)のマニュアルページを参照してください。AdvancedLinuxProgrammingの本を読んでください。

于 2012-12-10T12:07:34.653 に答える
1

サンプルコードでは、パイプの両端を閉じていません。あなたは閉じていますfd[0]そしてfd[1]。最初は、それらを閉じるだけでパイプの両端を閉じることができましたが、複製した後ではありませんfd[0]。パイプへのすべての参照を閉じるには、複製されたfdも閉じる必要があります。しかし、それはばかげているでしょう。lsが書き込めるように、端を正確に開いたままにしているのです。

おそらくあなたの混乱はclose()終わりについてですか?パイプの一方の端への参照であるfdを閉じます。それはパイプ自体を閉じません:それは何shutdown()をするかです。(shutdownを呼び出さない場合、パイプを参照するすべてのfdが閉じられると、パイプは自動的に閉じられます。)したがって、複製されたfdはまだ開いているため、プロセスはパイプに書き込むことができます(パイプは閉じられていません。それへの3つの参照のうち2つだけが閉じられました)。

于 2012-12-10T18:32:00.553 に答える