免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2508 | 回复: 5
打印 上一主题 下一主题

system为什么要阻塞SIGCHLD [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-26 14:49 |只看该作者 |倒序浏览
APUE上这么说
Whenever a process terminates or stops, the SIGCHLD signal is sent to the parent.
首先我不知道terminate和stop有什么不同

system(cmd)通过fork一个进程执行/bin/sh -c cmd,/bin/sh是不是要等到cmd返回以后才返回?
而system又要等要/bin/sh返回后再返回?

如果是这样,system为什么要阻塞SIGCHLD呢?因为cmd结束时SIGCHLD的发送给/bin/sh的啊。

论坛徽章:
0
2 [报告]
发表于 2006-11-26 14:58 |只看该作者
我的理解:

terminate 终止
stop 中止

stop 只是挂起,没有结束

论坛徽章:
0
3 [报告]
发表于 2006-11-26 15:13 |只看该作者
原帖由 jronald 于 2006-11-26 14:49 发表
APUE上这么说
Whenever a process terminates or stops, the SIGCHLD signal is sent to the parent.
首先我不知道terminate和stop有什么不同

system(cmd)通过fork一个进程执行/bin/sh -c cmd,/bin/sh是不是 ...

/bin/sh -c cmd 执行后,进程 sh 解析完 cmd 之后很快把自己的进程空间更换成 cmd 命令所指定的程序。所以 cmd 是以本来 sh 的进程空间执行,返回后 SIGCHLD 会发给执行 system 指令的进程,而不是 /bin/sh。因为这个时候 /bin/sh 已经不存在了。

论坛徽章:
0
4 [报告]
发表于 2006-11-26 15:55 |只看该作者
原帖由 isjfk 于 2006-11-26 15:13 发表

/bin/sh -c cmd 执行后,进程 sh 解析完 cmd 之后很快把自己的进程空间更换成 cmd 命令所指定的程序。所以 cmd 是以本来 sh 的进程空间执行,返回后 SIGCHLD 会发给执行 system 指令的进程,而不是 /bin/sh。因 ...


不是吧,exec*才有替换进程的作用啊。
system fork一个子进程a,然后这个子进程a通过exec*替换成/bin/sh,/bin/sh不fork了?

[ 本帖最后由 jronald 于 2006-11-26 15:56 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-11-26 16:09 |只看该作者
嗯,刚看了一下,system 等待的是 sh 结束,返回的是 sh 的退出状态。前面的表述有误。

cmd 结束后发送 SIGCHLD 给 /bin/sh,然后 /bin/sh 结束,会再发一个 SIGCHLD 给调用 system 的进程。system 在等待 /bin/sh 发出的 SIGCHLD。

[ 本帖最后由 isjfk 于 2006-11-26 16:11 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-11-26 19:49 |只看该作者
我知道了,可以不阻塞SIGCHLD的,但代码不易维护。。
也算是对system的封装
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP