将一个命令的输出作为另一个命令的输入管道传递

3
我有一个任务:
编写一个C程序来读取两个(或更多)可执行程序的名称,并将第一个程序的输出重定向到第二个程序的输入,将第二个程序的输出重定向到第三个程序的输入,以此类推...
我知道如何在shell中使用管道的基础知识。然而,我不知道如何使用C管道实现此任务。我不知道如何将一个程序的输出作为另一个程序的输入等。例如,在shell中:
ls | wc | ./add

这里,ls列出文件,wc给出列出文件的数量,./addwc给出的数字相加。

我该从哪里开始在C程序中实现管道?


啊,你需要使用“管道”函数。 - Vaughn Cato
1
http://pubs.opengroup.org/onlinepubs/009604599/functions/pipe.html - Vaughn Cato
1
该页面上有一些示例代码。如果您仍然遇到问题,请更具体地说明您卡在哪里。 - Vaughn Cato
4
好的,每个 | 都需要一个管道。首先,你需要创建一个管道,并使用 fork() 函数进行进程复制。在子进程中,将写入端复制到 stdout 上,然后使用 exec() 函数执行 ls 命令。现在再次使用 fork() 进行进程复制,在子进程中将读取端复制到 stdin 上,然后使用 exec() 函数执行 wc 命令。根据需要重复此过程 :) - Greg Inozemtsev
1
@AhorConverse,问作业没问题,但请说明这是作业。人们会更努力地解释和帮助你解决问题,而不仅仅是给你一个你可能不理解的答案。看起来你想编写一个执行 shell 工作的程序,设置管道并执行它。也许你应该看看像 dashash 这样的简单 shell 是如何做到的?甚至不要试图查看 bash 的源代码。 - Craig Ringer
请参阅此 GitHub Gist:mplewis/threePipeDemo.c。描述说:“这是一个使用 C 将三个命令连接在一起的示例。这个示例使用 ps aux | grep root | grep sbin。这个主题在网上的文档非常糟糕,希望这能帮助其他人。”我通过谷歌搜索"c pipe output of one command to another"找到了该链接。 - Gabriel Staples
3个回答

2
看起来你需要创建一个程序,完成 shell 的一项简单任务:创建和执行命令的管道,然后输出结果。
要正确地完成这个任务,你需要理解 SIGPIPE、子进程处理、输入/输出重定向、文件描述符、fork() 和 exec()、wait() 等等。
这篇 Linux 文档项目的文章——创建管道,应该能帮助你找到正确的方向。

1
当您使用pipe(pipefd)创建管道时,您会得到两个文件描述符。无论写入pipefd[1]的内容都可以从pipefd[0]读取。因此,您必须执行第一个程序,使其stdoutpipefd[1]相同,并执行第二个程序,使其stdinpipefd[0]相同。在执行命令之前,您可以使用dup()/close()技巧重新编号文件描述符,以便它们变为0stdin)或1stdout)。
要将三个程序连接起来进行管道处理,您需要两个管道。中间程序将从第一个管道中读取并写入第二个管道中。

我真的很想看到一个可运行的C语言示例。 - Gabriel Staples

0

Shell处理所有设置管道和创建进程的繁琐工作,因此您无需担心。 从程序的角度来看,这是来自 stdin 的常规输入,这意味着您可以使用常规的输入函数,例如 scanf 或 fread 从 stdin 。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接