我当前的程序使用管道和叉子实现管道“cat/etc/passwd | cut-f1-d:”。
我想扩展它来实现更长的管道“cat/etc/passwd | cut-f1-d:| sort”。
有人能解释一下我该怎么做吗?我尝试过但没有成功,但我知道我需要实现另一个分叉和管道来扩展管道。
当前程序代码如下:

#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;
}

最佳答案

你需要从管道的后端开始,而不是从前端开始。
试着用叉子和exec。叉子就是刀子,执行者就是:

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

10-08 00:34