2020-02-21
cat test.txt | grep 'hello'
这行命令表示在test.txt文件中查找包含单词'hello'的句子。我们先解释下这行命令是怎么实现的;
我们知道终端也是一个进程,当我们输入一个命令执行时,其实是终端程序调用fork和exec产生一个子进程执行命令程序;当终端在执行这行命令时,会先解析输入的参数,当发现输入的命令行中有‘|’符号时,就会知道在命令行中包含了管道,因此,在终端程序中:
- 会先fork出一个子进程,并执行exec将cat载入内存;
- 接着在cat程序中,用函数pipe定义出管道;
- 在定义出管道之后,再调用fork,生成一个子进程;
- 在父进程cat中关闭管道读端,将cat进程的标准输出重定向到管道的写端;
- 在子进程中将管道的写端关闭,将标准输入重定向到管道的读端,再调用exec将grep进程载入内存;
- 最后,cat的输出就可以最为grep的输入了;
这里需要说明的是,父进程cat对管道的操作必须在fork之前,否则父进程cat对管道的操作会继承到子进程,这样会导致子进程无法读取父进程的数据
网友评论