管道没有得到EOF

时间:2014-10-09 08:01:40

标签: c linux pipe

我正在尝试编写一个测试程序,它使用管道在3个linux命令之间传递信息。 bash相当于" ls | wc | WC&#34 ;.以下是我的代码 我得到的唯一输出是。该程序在没有退出的情况下卡在那里。

./a.out starting main creating pipe first

bash中的预期输出类似于

ls | wc | wc 1 3 24 编辑:在运行strace时,我可以看到主进程在wait4上,两个wc进程停留在read(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;
}

1 个答案:

答案 0 :(得分:2)

问题是我没有关闭每个分支中的所有管道。 我不得不关闭所有三个叉子和父母的p,p1。一旦我添加了它,它就可以了