Unix管道 - 三个进程之间的管道

时间:2013-11-18 19:25:44

标签: c unix pipe

我正在创建一个包含三个进程的小程序;源进程,过滤进程和接收进程。源进程的stdout被重定向到筛选器进程的stdin,并且筛选器进程'stdout被重定向到接收进程'stdin。

我的问题是没有输出从接收器进程打印到stdout。您是否可以在以下微小的代码片段中看到问题?

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


int main(int argc, char** argv)
{
     // Pipes
     // pipe1 is from source to filter, pipe2 is from filter to sink
     int pipe1[2], pipe2[2];

     // Create pipes
     if (pipe(pipe1) < 0 || pipe(pipe2) < 0)
     {
          perror("Creating pipes failed!");
     }

     if (fork() == 0)
     {
          close(1);
          dup(pipe1[1]);
          close(pipe1[0]);

          close(pipe2[0]);
          close(pipe2[1]);

          execlp("ls", "ls", NULL);
          exit(0);
     }
     else
     {
          if (fork() == 0)
          {
               close(0);
               dup(pipe1[0]);
               close(pipe1[1]);

               close(1);
               dup(pipe2[1]);
               close(pipe2[0]);

               execlp("sort", "sort", NULL);
               exit(0);
          }
          else
          {
               if (fork() == 0)
               {

                    close(0);
                    dup(pipe2[0]);

                    execlp("more", "more", NULL);
                    exit(0);
               }
          }
     }


     wait(NULL);
     printf("Done.\n");

     return 0;
}

BR

雅各

2 个答案:

答案 0 :(得分:0)

我认为问题可能是,wait只会等待一个进程。当父母在第一个孩子返回后退出时,我怀疑more命令也决定终止,因为它可能会获得SIGHUP(猜测,不确定)。

但是,请检查所有系统调用中的错误!同样对于成功的wait次调用,打印孩子退出的原因(是信号还是正常退出,如果是正常退出,退出代码是什么)。

另请注意,perror不会退出,只会打印。

尝试查看为什么某些代码失败,如果它没有错误处理,这是毫无意义的......

答案 1 :(得分:0)

为您的方案执行管道的一些简单方法:

char cmd[MAX_LEN];
sprintf(cmd, "%s | %s | %s", app1, app2, app3); //app123 holds app name + args
system(cmd);

如果要捕获最后一个应用的输出,请使用popen:

FILE pPipe = popen(cmd, "rt"); /* same access flag as fopen()*/
while (NULL != fget(buf, buf_len, pPipe)) {
    // do something with the read line in 'buf'
}