Linux中使用pipe()创建链式管道

4
我知道如何用C语言在Linux中创建一个管道,看起来像cat /tmp/txt | grep foo,但我在实现多个链接的管道时遇到了问题,例如cat /tmp/1.txt | uniq -c | sort。如何使用Linux中的pipe()函数来实现呢?
更新:我已经解决了这个问题。如果有人有同样的问题,这里是代码:
enum PIPES {
    READ, WRITE
};


 int filedes[2];
    int filedes2[2];
    pipe(filedes);
    pipe(filedes2); 

    pid_t pid = fork();
    if (pid == 0) {
        dup2(filedes[WRITE], 1);
    char *argv[] = {"cat", "/tmp/1.txt", NULL};
        execv("/bin/cat", argv); 
        exit(0);
    } 
    else {
        close(filedes[1]);
    }

    pid = fork();
    if (pid == 0) {
    dup2(filedes[READ], 0);
    dup2(filedes2[WRITE], 1);
        char *argv[] = {"uniq", "-c", NULL};
        execv("/usr/bin/uniq", argv);       
    }
    else {
        close(filedes2[1]);
    }

    pid = fork();
    if (pid == 0) {
        dup2(filedes2[READ], 0);
        char *argv1[] = {"sort", NULL};
            execv("/usr/bin/sort", argv1);
    }

    waitpid(pid);
2个回答

2
你会获得一对文件描述符 - 让我们称它们为ab。随后调用pipe将给你文件描述符cd。 因此,你要连接bc以链接这两个进程。例如,创建另一对文件描述符并将d连接到e等等。

1

管道有两个端点(读和写),pipe()会相应地将两个文件描述符放入您指定的数组中。第一个是读端,第二个是写端。

因此,在您的示例中,您将创建两个管道并:

  • cat的标准输出连接到第一个管道的写端,
  • uniq的标准输入连接到第一个管道的读端,
  • uniq的标准输出连接到第二个管道的写端,
  • sort的标准输入连接到第二个管道的读端。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接