以下に書かれているコードから疑わしい点があります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void){
int pid;
int i,j;
char c;
int pfd[2];
if(pipe(pfd) == -1){
perror("pipe");
exit(1);
}
// pfd[0] : process read from pfd[0]
// pfd[1] : process write to pfd[1]
pid = fork();
if(pid == -1){
perror("pid error\n");
exit(1);
}
else if(pid == 0){
close(pfd[0]);
close(1);
dup(pfd[1]);
close(pfd[1]);
execlp("./lcmd", "lcmd", NULL);
exit(0);
}
else if(pid > 0){
wait(NULL);
close(pfd[1]);
close(0);
dup(pfd[0]);
close(pfd[0]);
execlp("./rcmd", "rcmd", NULL);
printf("\n");
}
return 0;
}
このコードは、dup 関数の処理方法を説明しています。
ご覧のとおり、pid が 0 の場合 (子プロセスが進行中であることを意味します)、パイプの読み取り部分を閉じ、stdout ファイル記述子も閉じます。(閉じる(pdf[0])、閉じる(1))。
パイプの書き込み部分(pdf[1])は前のstdoutの場所に配置する必要があるため、stdout fdを閉じる必要があることを理解できます。(dup(pdf[1]))
ただし、なぜパイプの一部を読み取り (close(pdf[0]) )、パイプの書き込み部分を閉じる必要があるのか (close(pfd[1])) を理解できませんでした。
パイプは双方向とはいえ、使用しないパイプの他の部分を閉じた状態にする必要はないと思います。
特に、close(pdf[1]) <- この部分、出力ストリームがない場合 (execlp 関数を実行する前に stdout と pdf[1](パイプの書き込み部分) が閉じられたため)、execlp 関数の出力はどこに行きましたか? ?