使用pipe()在linux中链接管道

时间:2011-11-28 18:11:19

标签: c linux pipe

我知道如何使用看起来像cat /tmp/txt |grep foo的C在Linux中创建一个管道,但是我在实现多个链式管道时遇到了问题,例如cat /tmp/1.txt | uniq -c | sort。如何在Linux中使用pipe()使用C?

更新:我已经明白了。如果有人有同样的问题,这是代码:

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 个答案:

答案 0 :(得分:2)

你得到一对文件描述符 - 我们称之为ab。随后对pipe的调用会为您提供文件描述符cd

因此,您要将b连接到c,以便将这两个进程链接起来。例如,创建另一对文件描述符并将d连接到e,依此类推。

答案 1 :(得分:1)

管道有两端(读取和写入),pipe()因此将两个文件描述符放在您指定的数组中。第一个是读端,第二个是写端。

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

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