C 通过子进程中的管道读取输入时,循环无法终止

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

我正在使用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","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处理总是很麻烦。对每个流程中的每个流程进行说明