5

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

ls | grep hello

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

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

现在我想编写一个 C 程序,它将一个命令的管道输出作为输入。意味着,在“grep”程序如何能够从 ls 命令(在我上面的示例中)获取输入的类似热情中。

另一个用户在这里提出了类似的问题,但由于某种原因,该线程已被标记为“不是有效问题”

我最初认为我们可以将其作为 C 程序的命令行参数。但这种情况并非如此。

4

2 回答 2

4

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

您可以使用通常的scanffread功能访问它。scanf等默认情况下对标准输入进行操作(与默认printf对标准输出进行操作的方式相同;在没有管道的情况下,标准输入连接到终端),并且 C 标准库提供了一个类似从 FILE 读取FILE *stdin的函数fread溪流。

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

于 2013-06-01T18:06:52.540 回答
0

如果是事实,ls并且同时grep开始。

ls | grep hello意思是,使用ls' 标准输出作为grep' 标准输入。ls将结果写入标准输出,grep等待并立即从标准输入读取任何输出。

仍有疑问?做一个实验。跑

find / | grep usr

find /将列出计算机上的所有文件,这应该需要很多时间。

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

于 2013-06-01T18:08:23.813 回答