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