C 通过管道将一个命令的输出作为另一个命令的输入

C 通过管道将一个命令的输出作为另一个命令的输入,c,pipe,C,Pipe,我至少知道管道的基本知识。然而,我不明白如何使用C管道在C中实现这个任务。我不知道如何将一个程序的输出作为另一个程序的输入,等等。例如: ls | wc | ./add 此处ls列出文件,wc给出列出文件的计数,/add添加wc给出的数字 请帮忙 编辑:这是一项作业。准确的问题陈述如下所示: 编写一个C程序来读取两个(或更多)可执行文件的名称 程序,并将第一个程序的输出重定向到 第二个程序,第二个程序的输出到 第三个计划,等等……” shell处理所有设置管道和创建进程的繁重工作,因此您根本不

我至少知道管道的基本知识。然而,我不明白如何使用C管道在C中实现这个任务。我不知道如何将一个程序的输出作为另一个程序的输入,等等。例如:

ls | wc | ./add
此处
ls
列出文件,
wc
给出列出文件的计数,
/add
添加
wc
给出的数字

请帮忙

编辑:这是一项作业。准确的问题陈述如下所示:

编写一个C程序来读取两个(或更多)可执行文件的名称 程序,并将第一个程序的输出重定向到 第二个程序,第二个程序的输出到 第三个计划,等等……”


shell处理所有设置管道和创建进程的繁重工作,因此您根本不必担心这一点。从您的程序的角度来看,这是来自
stdin
的正常输入,这意味着您可以使用正常的输入功能,例如
scanf
fread
,从
stdin

看来您需要创建一个程序来完成shell的简单工作:创建并执行命令管道,然后输出结果

要做到这一点,您需要了解
SIGPIPE
、子进程处理、输入/输出重定向、文件描述符、
fork()
exec()
wait()
,等等

应该可以帮助您找到正确的路径。

当您使用管道(pipefd)创建管道时,会得到两个文件描述符。任何写入pipefd[1]的内容都可以从pipefd[0]读取。因此,您必须执行第一个程序,使其stdout与pipefd[1]相同,并执行第二个程序,使其stdin与pipefd[0]相同。在执行命令之前,可以使用dup()/close()技巧对文件描述符重新编号,使其变为0(stdin)或1(stdout)


对于三个程序的管道,您将有两个管道。中间的程序将从第一个程序读取,然后写入第二个程序。

不确定“实际将一个程序的输出作为另一个程序的输入”是什么意思。您想知道如何将wc的输出输入到add命令中吗?是的。但在此之前,我想要一个ls的wc。您在问题中显示了执行此操作的命令--“ls | wc |./add”,所以我有点困惑。好吧,每个
都需要一个管道。首先,在子dup中创建一个管道fork,将写端复制到stdout和exec ls上。现在再次分叉,在子dup中,将读取端复制到stdin和exec wc上。根据需要重复:)@Craig Ringer。是的,你的猜测是对的。这是一项任务。确切的问题陈述是“编写一个C程序来读取两个(或更多)可执行程序的名称,并将第一个程序的输出重定向到第二个程序的输入,将第二个程序的输出重定向到第三个程序的输入,依此类推…”