管道没有得到EOF

问题描述:

我想写一个测试程序,它使用管道在3个linux命令之间传递信息。相当于“ls | wc | wc”的bash。以下是我的代码 我得到的唯一输出是。该程序停留在那里而不退出。管道没有得到EOF

./a.out starting main creating pipe first

在bash的预期结果是一样的东西

ls | wc | wc 1 3 24 编辑:在运行strace的我看得出来,主要工艺是wait4,两个卫生间进程停留在读(0)。正如我猜测的那样,因为wc没有获得EOF。为什么这样?能有人帮我找出问题吗?

#include<unistd.h> 
#include<stdlib.h> 
#include<stdio.h> 

int p[2]; 
int p1[2]; 
int r=0; 


int fork1(void) 
{ 
    int pid; 
    pid = fork(); 
    if(pid == -1) { 
     perror("fork"); 
     exit(1); 
    } 
    return pid; 
} 
int main (int argc, char const* argv[]) 
{ 
    printf("starting main\n"); 
    printf("creating pipe first\n"); 
    if(pipe(p)<0) { 
     perror("pipe"); 
     exit(1); 
    } 
    if(pipe(p1)<0) { 
     perror("pipe"); 
     exit(1); 
    } 
    if(fork1()==0) { 
     //send output to p 
     close(1); 
     dup(p[1]); 
     close(p[0]); close(p[1]); 

     execlp("ls","ls",NULL); 
     exit(0); 

    } 
    if(fork1() == 0) { 
     close(1);//write to p1 
     dup(p1[1]); 
     close(p1[1]); close(p1[0]); 

     close(0);//read from p 
     dup(p[0]); 
     close(p[0]); close(p[1]); 
     execlp("wc","wc",NULL); 
     exit(0); 
    } 
    if(fork1() == 0) 
    { 

     close(0);//read from p1 
     dup(p1[0]); 
     close(p1[0]); close(p1[1]); 
     execlp("wc","wc",NULL); 
     exit(0); 
    } 
    close(p[0]); close(p[1]); close(p1[0]); close(p1[1]); 
    wait(&r);wait(&r);wait(&r); 
    printf("parent done\n"); 

    return 0; 
} 
+3

如何在系统上声明'wait()'?在我的,我必须'#include ',然后它不会编译,因为wait()接受一个参数,你没有提供。这是未定义的行为。用-Wall或编译器的等价物编译以启用警告。 – 2014-10-09 08:08:20

+0

我包括#include #include 文件,它给了我一个错误。我用等待的参数修改了代码。 – woodstok 2014-10-09 08:12:31

+0

只需在strace -f下运行它,看看哪个进程正在做什么。 – Useless 2014-10-09 08:21:19

问题是我没有关闭每个分支中的所有管道。 我不得不在所有三个叉子和父母中关闭p,p1。一旦我添加这些,它是工作

+0

谢谢,来自陌生人的未来。你救了我。 – DonutGaz 2017-02-24 22:01:05