C 通过子进程中的管道读取输入时,循环无法终止
我正在使用C编写管道实现。我必须编写C等价物(grep-rF regex directory | tee output.txt | wc-l)。但是,代码无法超出等效的tee。(以下代码中标记的循环从未终止)。我不明白为什么循环没有终止,为什么管道的输出没有传递到C 通过子进程中的管道读取输入时,循环无法终止,c,pipe,fork,system-calls,child-process,C,Pipe,Fork,System Calls,Child Process,我正在使用C编写管道实现。我必须编写C等价物(grep-rF regex directory | tee output.txt | wc-l)。但是,代码无法超出等效的tee。(以下代码中标记的循环从未终止)。我不明白为什么循环没有终止,为什么管道的输出没有传递到newpipe的输入 当我删除while循环时,程序终止,输出为0 int newpipe[2],p[2],pid; char * argv_list1[] = {"grep","-rF","regex","direct
newpipe
的输入
当我删除while循环时,程序终止,输出为0
int newpipe[2],p[2],pid;
char * argv_list1[] = {"grep","-rF","regex","directory",NULL};
char * argv_list2[] = {"wc","-l",NULL};
char *file="output.txt";
pid=fork();
if(pid==0){
int pid2=fork();
if(pid2==0){
close(p[0]);
dup2(p[1],1);
execvp("grep",argv_list1);
}
else{
wait(NULL);
int fd=open(file, O_RDWR | O_CREAT |O_TRUNC,0666);
close(newpipe[0]);
close(p[1]);
dup2(p[0], 0);
printf("pid2=%d\n",pid2);
dup2(newpipe[1],1);
char tmp;
while(read(p[0],&tmp,1)){
write(fd,&tmp,1);
write(1,&tmp,1);
}//This loop never terminates and the output comes on standard output
exit(1);
}
}
else{
wait(NULL);
close(newpipe[1]);
dup2(newpipe[0],0);
execvp("wc",argv_list2);
}
正如所发布的,您的代码从不调用pipe()来创建管道;所以这是一个问题,但在它发生之后,你有更多的fd工作要做 在第一个子项exec()的grep中,正确地关闭p[0],并将写入端(p[1])复制到STDOUT_FILENO(顺便说一句,比1更具描述性),但不要关闭p[1];dup2就像复制品,而不是移动。这让它摇摆不定。您可能会在最外层的进程中创建新管道,因此必须在此处关闭它的两端 这同样适用于T形三通,它需要关闭其未使用的FD,以及wc工艺 您需要删除等待,因为它们掩盖了一些fd处理错误。顺便说一句,注意在tee中,您将p[0]复制到0,然后从p[0]读取。悬挂的管道不会产生EOF 围绕管道()和fork()的fd处理总是很麻烦。对每个流程中的每个流程进行说明