另一个Linux命令输出(Piped)作为我的C程序的输入

时间:2013-06-01 18:00:00

标签: c pipe

我现在正在研究Linux中的一个小型C程序。让我解释一下我想用下面的示例Linux命令做什么

ls | grep hello

以上命令以下面的激情执行(如果我错了,请告诉我)

  1. ls命令将首先执行
  2. 将输出grep命令,该命令将通过匹配“hello”
  3. 再次生成输出

    现在我想编写一个C程序,它将一个命令的管道输出作为输入。意思是,“grep”程序能够从ls命令获得输入的类似激情(在上面的例子中)。

    其他用户here也提出了类似的问题,但由于某种原因,此主题已被标记为“不是有效的问题”

    我最初认为我们可以将它作为C程序的命令行参数。但事实并非如此。

2 个答案:

答案 0 :(得分:4)

如果将输出从一个命令传递到另一个命令,则该输出将在接收进程的标准输入(stdin)上可用。

您可以使用常规scanffread功能访问它。 scanf等默认情况下在stdin上运行(默认情况下printf在stdout上运行的方式相同;在没有管道的情况下,stdin连接到终端)和C标准库为从{FILE流中读取的fread等函数提供FILE *stdin

POSIX还在STDIN_FILENO中提供unistd.h宏,用于操作一个文件描述符的函数。这基本上总是0,但依赖于这种情况是不好的形式。

答案 1 :(得分:0)

如果事实,lsgrep同时开始。

ls | grep hello表示使用ls的标准输出作为grep的标准输入。 ls将结果写入标准输出,grep等待并立即读取标准输入的任何输出。

还有疑惑吗?做一个实验。跑

find / | grep usr

find /会列出计算机上的所有文件,这需要花费很多时间。

如果ls先运行,那么操作系统会将输出提供给grep,我们应该等待很长时间,然后屏幕空白,直到find完成并grep开始。但是,我们可以立即看到结果,这就是证明。