2013-06-01 72 views
3

我现在正在研究Linux中的一个小型C程序。让我来解释一下什么我想下面另一个Linux命令输出(管道)作为我的C程序的输入

ls | grep hello 

上面的命令是在下面的激情执行的样品Linux命令这样做(让我知道如果我有这个错误)

  1. LS命令将被执行的第一
  2. 输出将给出到grep命令将由匹配“你好”

现在再次生成输出我想写一个C程序这需要在p将一个命令的输出作为输入。意思是,在“grep”程序如何能够从ls命令(在上面的示例中)获得输入的类似激情中。

类似的问题已经被问另一个用户here,但由于某些原因,这个主题已经被标记为我最初以为我们可以得到这样的作为命令行参数的C程序“不是一个有效的问题”

。但这种情况并非如此。

+2

Unix管道通过['STDIN'和'STDOUT']工作(http://en.wikipedia.org/wiki/Standard_streams)。你只需要阅读_standard in_来获得你的输入,然后写出_standard out_给你的输出。 – DaoWen

+0

感谢DaoWen - 我已经通过阅读STDIN的输入来实现它 –

回答

3

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

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

对于运行一个文件描述符的函数,POSIX还提供了一个STDIN_FILENO宏,其格式为unistd.h。这基本上总是0,但依靠这种情况是不好的形式。

+0

谢谢 - 我刚刚使用“scanf”实现了该程序,这已经完成了这个技巧。 –

0

如果其实lsgrep同时启动。

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

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

find /会列出计算机上的所有文件,就应该花费大量的时间。

如果ls先运行,然后OS使输出grep,就要等待很长一段时间,黑屏,直到find成品和grep开始。但是,我们可以立即看到结果,这就是一个证明。

+0

尽管如此,但这并不能完全回答这个问题。 – Cairnarvon

+0

你说得对。它不回答这个问题。我想用评论来描述它,但我想让它更具可读性...... –

相关问题