forks和管道实现linux编译器

时间:2014-03-17 20:22:08

标签: c linux fork pipe

我从“Pipes” sectionBeej’s Guide to Unix IPC获取了以下代码。

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

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

    pipe(pfds);

    if (!fork()) {
        close(1);       /* close normal stdout */
        dup(pfds[1]);   /* make stdout same as pfds[1] */
        close(pfds[0]); /* we don't need this */
        execlp("ls", "ls", NULL);
    } else {
        close(0);       /* close normal stdin */
        dup(pfds[0]);   /* make stdin same as pfds[0] */
        close(pfds[1]); /* we don't need this */
        execlp("wc", "wc", "-l", NULL);
    }

    return 0;
}

此代码允许用户查看特定目录中有多少文件。如何编辑此代码以实现更长的管道cat /etc/passwd | cut –f1 –d: | sort?有没有人知道如何做到这一点,因为我完全卡住了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

感觉像家庭作业,所以我只是给你一些指示:

  • 较长的管道有两个管道,因此您需要两次调用pipe()。 (我还在检查管道的返回值时。)

  • 有三个过程,即两个叉子。再次,正确检查fork()的返回值:它的三态:父,子或失败,你的程序应该测试所有三种情况。

  • 如果在前面两次调用pipe(),请仔细考虑每个进程中哪些文件描述符(即管道的哪一端),以及在调用execlp()之前要关闭哪些文件描述符。我画了一张照片。

  • 我更喜欢dup2()到dup(),因为你明确地设置了目标文件描述符,所以在调用中指定它是有意义的。也避免了愚蠢的错误。

  • dup和execlp可能会失败,所以我也要检查它们的返回值......

答案 1 :(得分:0)

您需要(取决于命令列表的长度)一些管道。但是:对于中间的进程,最多只需要两个管道对fds,第一个和最后一个需要一个管道对fds。确实要关闭不需要的管道fds - 否则,子进程可能无法获得EOF而且永远不会完成。

并且(如user3392484所述):检查所有系统调用是否存在错误情况并将其报告给调用者。这将使生活更轻松。

我在最后几天实施了类似的东西,也许你想看一看:pipexec.c

亲切的问候 - 安德烈亚斯