我从下面的代码中得到了一个可疑点。
#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))。
我可以理解stdout fd应该是关闭的,因为管道的一部分(pdf [1])应该位于之前的stdout位置。 (DUP(PDF [1]))
然而,我无法得到为什么读取管道的一部分(close(pdf [0])和写入管道的一部分应该关闭(关闭(pfd [1]) )
即使管道是双向的,我认为没有必要说明关闭不使用的管道的其他部分。
特别是,关闭(pdf [1])&lt; - 这一部分,如果没有输出流(因为stdout和pdf [1](写入管道部分)在执行execlp函数之前关闭了),输出在哪里execlp函数去了吗?
答案 0 :(得分:3)
管道不是双向的 - 读取端无法写入,写入端无法读取。
管道上的读取操作不会在写入结束打开的过程中报告EOF,即使打开写入结束的唯一进程是尝试读取的进程。
因此,关闭足够的文件描述符至关重要。根据经验,如果使用dup2()
或dup()
将管道的一端设为标准输入或标准输出,则应关闭两个管道文件描述符。 / p>