【问题标题】:forks and pipes implementation linux compiler叉子和管道实现Linux编译器
【发布时间】:2014-03-17 20:22:07
【问题描述】:

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

#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?有谁知道如何做到这一点,因为我完全被卡住了。任何帮助将不胜感激。

【问题讨论】:

标签: c linux fork pipe


【解决方案1】:

感觉像是功课,所以我只是给你一些指点:

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

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

  • 1234563我会画一幅画。
  • 我更喜欢 dup2() 而不是 dup(),因为您明确设置了目标文件描述符,因此在调用中指定它是有意义的。也避免了愚蠢的错误。

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

【讨论】:

    【解决方案2】:

    您需要(取决于命令列表的长度)一些管道。但是:对于中间的一个进程,您最多需要两个管道对 fd,对于第一个和最后一个,您需要一个管道对 fd。请务必关闭不需要的 pipe-fds - 如果没有,子进程可能不会获得 EOF 并且永远不会完成。

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

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

    亲切的问候 - 安德烈亚斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 2017-07-07
      • 1970-01-01
      • 2014-01-03
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多