c - 扩展程序以使用三个命令实现流水线

标签 c linux pipe fork ipc

我当前的程序使用管道和 fork 实现管道“cat/etc/passwd | cut -f1 -d:”。
我想扩展它以实现更长的管道“cat/etc/passwd | cut -f1 -d:| sort”。

有人可以解释一下我应该怎么做吗?我尝试没有成功,但我知道我需要实现另一个 fork 和管道来扩展管道。

当前程序代码如下:

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

int main(void)
  {
    int pfds[2];

    pipe(pfds);

    if(!fork()) {       /*only use child process*/
      close(1); /*close normal stdout*/
      dup(pfds[1]); /*make stdout same as pfds[1]*/
      close(pfds[0]);   /*Dont need this (stdin)*/
      execlp("/bin/cat","cat", "/etc/passwd", NULL);
  }
    else{
      close(0); /*close normal stdin*/
      dup(pfds[0]); /*make stdin same as pfds[0]*/
      close(pfds[1]); /*we dont need this (stdout)*/
      execlp("/usr/bin/cut","cut", "-f1","-d:", NULL); 


  }

  int pfds2[2]; 
  pipe(pfds2);

    if(!fork()){
        dup(pfds2[1]);
        close(pfds2[0]);
        execlp("/usr/bin/sort", "sort", NULL);

  }
    else{
      close(pfds2[1]);
  }


 return 0;
}

最佳答案

您需要从管道的后端开始,而不是前端。

尝试执行 fork 和 exec。 fork 将是 cut,exec 将是 sort:

fork -- exec -- sort
  |
fork -- exec -- cut
  |
no fork -- exec -- cat

关于c - 扩展程序以使用三个命令实现流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42891751/

相关文章:

git - 如何通过管道传输到 git tag 命令?

c - 相当于ping的网络设备模块

c - 将整数函数结果视为 bool 值是最佳做法吗

c - 除非输入字符,否则如何让 scanf() 继续读取整数输入?

linux - NPM 无法安装 appjs。错误 : Cannot find module 'graceful-fs'

c - 如何从流中读取数据而不等待换行符?

node.js - 进程替换 - Node.js child_process

c - 使用 phtreads 从 C 中的多个线程读取和写入不同位置的数组是否安全?

php - C++ 轻量级 linux web 直通服务器

python - 为什么这段代码不起作用?