- 论坛徽章:
- 0
|
前面说得匆忙, 有点不准确, 现在让我来透彻的解释一下吧. 其实要想理解很多shell和unix 命令的运行原理, 需要有unix c 的编程经验
shell遇到'|' 首先会创建管道 pipe(int fildes[2]), 得到两个文件描述符fildes[0],fildes[1].
然后shell使用dup() 分别将stdout 重定向到 des[0], stdin 重定向到 fildes[1].
接着fork+exec grep 和ps .. 注意先后顺序: grep在前. 因为grep要等待输入, 如果ps在前, 有可能grep启动后ps就结束了 .. 这里还有理解问题的一个关键点: subprocess要继承parent process的打开文件描述符表, 所以 stdout 重定向到 des[0], stdin 重定向到 fildes[1]的效果就分别在ps和grep子进程中得到的体现
=====================
可能又犯了个错误:
fork+exec ps和grep应该不需要有先后循序的限制.. 如果ps在运行结束后,其输出存在pipe(文件)里, 不会丢失, 等待grep读取 ..所以严格意义已上将, ps xxx|grep xxxx 有时候会看不到grep进程自己 |
|