【问题标题】:chained pipes in linux using pipe()linux 中使用 pipe() 的链式管道
【发布时间】:2011-11-28 18:11:19
【问题描述】:

我知道如何在 Linux 中使用 C 语言创建一个类似于 cat /tmp/txt |grep foo 的管道,但我在实现多个链式管道时遇到问题,例如 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);

【问题讨论】:

    标签: c linux pipe


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-31
        • 2014-11-24
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        相关资源
        最近更新 更多