免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8461 | 回复: 27

关于ps后的grep问题 [复制链接]

论坛徽章:
0
发表于 2008-09-11 12:53 |显示全部楼层
不知道大家有没有注意:
ps aux|grep ssh
root      2594  0.0  0.0   4936  1124 ?        Ss   Sep09   0:00 /usr/sbin/sshd
root      5858  0.0  0.1   7496  2084 ?        Ss   09:27   0:00 sshd: sszheng [priv]
sszheng   5862  0.0  0.0   7660  1380 ?        S    09:27   0:00 sshd: sszheng@pts/0
sszheng   5983  0.0  0.0   1648   512 pts/1    S+   12:07   0:00 grep ssh

显示结果中,有sszheng   5983  0.0  0.0   1648   512 pts/1    S+   12:07   0:00 grep ssh这行

根据管道概念,前面的输出作为后面的输入,而ps aux|grep ssh应该是执行ps,再执行grep,那么ps为什么会显示到grep ssh这个进程呢?

这个调度过程如何理解?

论坛徽章:
0
发表于 2008-09-11 13:03 |显示全部楼层
For this case, what shell does sequentially:

1 shell creates pipe
2 fork and exec ps and grep ...
3. pipe links ps' stdout to grep's stdin
4. grep process wait until some input (stdin) that is actually ps' output (stdout)

论坛徽章:
0
发表于 2008-09-11 13:06 |显示全部楼层
The key point is grep must wait for input to go ahead, see the following

$ grep xxxx

now waiting .....

论坛徽章:
0
发表于 2008-09-11 13:11 |显示全部楼层
原帖由 nhw_cs 于 2008-9-11 13:03 发表
For this case, what shell does sequentially:

1 shell creates pipe
2 fork and exec ps and grep ...
3. pipe links ps' stdout to grep's stdin
4. grep process wait until some input (stdin) that ...



correction:

1 shell creates pipe
2 pipe links stdout to stdin
3 fork and exec ps and grep ...
4 grep process wait until some input (stdin) that ...

论坛徽章:
0
发表于 2008-09-11 13:13 |显示全部楼层

回复 #4 nhw_cs 的帖子

论坛徽章:
0
发表于 2008-09-11 13:29 |显示全部楼层
两个进程也有先后顺序啊,要是ps先执行了就看不到grep了吗?可是我每次执行都能看到

论坛徽章:
0
发表于 2008-09-11 13:32 |显示全部楼层
前面说得匆忙, 有点不准确, 现在让我来透彻的解释一下吧. 其实要想理解很多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子进程中得到的体现

到此为止应该清楚了吧?

论坛徽章:
0
发表于 2008-09-11 13:38 |显示全部楼层
原帖由 源方 于 2008-9-11 13:29 发表
两个进程也有先后顺序啊,要是ps先执行了就看不到grep了吗?可是我每次执行都能看到



你执行的次数少

多执行几次就发现有时间你看不到

论坛徽章:
0
发表于 2008-09-11 13:55 |显示全部楼层
前面说得匆忙, 有点不准确, 现在让我来透彻的解释一下吧. 其实要想理解很多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进程自己

论坛徽章:
0
发表于 2008-09-11 14:02 |显示全部楼层

回复 #9 nhw_cs 的帖子

这个先后顺序具有随机性?ls给个实验看看?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP