我现在正在研究Linux中的一个小型C程序。让我解释一下我想用下面的示例Linux命令做什么
ls | grep hello
以上命令以下面的激情执行(如果我错了,请告诉我)
现在我想编写一个C程序,它将一个命令的管道输出作为输入。意思是,“grep”程序能够从ls命令获得输入的类似激情(在上面的例子中)。
其他用户here也提出了类似的问题,但由于某种原因,此主题已被标记为“不是有效的问题”
我最初认为我们可以将它作为C程序的命令行参数。但事实并非如此。
答案 0 :(得分:4)
如果将输出从一个命令传递到另一个命令,则该输出将在接收进程的标准输入(stdin)上可用。
您可以使用常规scanf
或fread
功能访问它。 scanf
等默认情况下在stdin上运行(默认情况下printf
在stdout上运行的方式相同;在没有管道的情况下,stdin连接到终端)和C标准库为从{FILE流中读取的fread
等函数提供FILE *stdin
。
POSIX还在STDIN_FILENO
中提供unistd.h
宏,用于操作一个文件描述符的函数。这基本上总是0,但依赖于这种情况是不好的形式。
答案 1 :(得分:0)
如果事实,ls
和grep
同时开始。
ls | grep hello
表示使用ls
的标准输出作为grep
的标准输入。 ls
将结果写入标准输出,grep
等待并立即读取标准输入的任何输出。
还有疑惑吗?做一个实验。跑
find / | grep usr
find /
会列出计算机上的所有文件,这需要花费很多时间。
如果ls
先运行,那么操作系统会将输出提供给grep
,我们应该等待很长时间,然后屏幕空白,直到find
完成并grep
开始。但是,我们可以立即看到结果,这就是证明。