首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >forks and pipes实现linux编译器

forks and pipes实现linux编译器
EN

Stack Overflow用户
提问于 2014-03-18 04:22:08
回答 2查看 234关注 0票数 0

我有以下取自Beej’s Guide to Unix IPC“Pipes” section的代码。

代码语言:javascript
复制
#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?有没有人知道怎么做,因为我完全卡住了。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2014-03-18 04:29:55

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

较长的管道有两个管道,因此您需要调用

  • ()两次。(同时我也会检查管道的返回值。)

  • 有三个进程,这意味着两个fork。再一次,检查fork()的返回值:它是三态的:父进程、子进程或失败进程,你的程序应该测试所有这三种情况。

  • 如果你预先调用了两次

  • (),仔细考虑哪些文件描述符(即管道的哪些末端)是每个进程中的哪些,以及在调用execlp()之前关闭哪些文件描述符。

  • 我更喜欢dup2()而不是dup(),因为您显式地设置了目标文件描述符,所以在调用中指定它是有意义的。

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

Stack Overflow用户

发布于 2014-03-18 04:56:06

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

和(正如user3392484所说的):检查所有系统调用的错误条件,并将它们报告给调用者。这将使生活变得更容易。

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

致以亲切的问候-- Andreas

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22464543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档