当前时区 GMT+8, 现在时间是 2008-8-30 19:34 游客: 注册 登录 仅登录论坛 | 搜索 帮助
标题: system函数
clm615
新手上路
Rank: 1



UID 242664
精华 0
积分 4
帖子 7
阅读权限 10
注册 2007-8-4
状态 离线
发表于 2007-8-11 22:49  资料  短消息  加为好友 
system函数

在看APUE10.18这节看调用system函数的程序时,有个问题向大家讨教。以下时程序的简单描述:
sig_int(int),sig_chld(int);
main()
{
signal(SIGINT,sig_int);
signal(SIGCHLD,sig_CHLD);
system("/bin/ed");}
书上说这个程序的过程是:a.out(父进程)fork出一个shell处理命令,然后在shell上fork一个进程那就是ed。

在解释这个程序是有这么一段话:“当编辑程序终止时,对父进程(a.out进程)产生SIGCHLD信号。父进程捕捉它,执行其处理程序sig_chld,然后从其返回。但是若父进程正捕捉SIGCHLD信号,那么在system函数执行时,父进程中该信号的递送应当阻塞。实际上,这就是POSIX所说明的。否则,当system创建的子进程结束时,system的调用者可能错误地认为,它自己的一个子进程结束了。”

1、他说当编辑程序终止时,对父进程(a.out进程)产生SIGCHLD信号,编辑程序的父进程不是shell吗,怎么会是a.out呢?
2、“当system创建的子进程结束时,system的调用者可能错误地认为,它自己的一个子进程结束了。”system创建的子进程是ed编辑器,system的调用者是a.out,ed结束的时候,是由shell收到SIGCHLD信号的,a.out 怎么会认为自己的子进程结束了呢,a.out没收到信号啊?

顶部
clm615
新手上路
Rank: 1



UID 242664
精华 0
积分 4
帖子 7
阅读权限 10
注册 2007-8-4
状态 离线
发表于 2007-8-13 17:12  资料  短消息  加为好友 
晕哦,问题太弱,没人愿意回答吗

顶部
kennethjia
新手上路
Rank: 1


UID 52109
精华 0
积分 6
帖子 4
阅读权限 10
注册 2003-7-21
来自 China.gif
状态 离线
发表于 2007-8-16 17:17  资料  短消息  加为好友 
是绕口了。
其实 shell 和 ed (可能是孙子进程)都是 a.out 的子进程,
不过system API不应该影响整个程序,要让用户觉得system完成它的工作
而且没有别的事情要做。
如果不是父进程中该信号的递送应当阻塞, 会影响a.out 处理其他子进程 .





1882276343
顶部
clm615
新手上路
Rank: 1



UID 242664
精华 0
积分 4
帖子 7
阅读权限 10
注册 2007-8-4
状态 离线
发表于 2007-8-17 08:40  资料  短消息  加为好友 
感谢kennethjia 的回复,然我好激动啊,虽然还是有点看不懂,起码有点思路了。谢谢哈

顶部
 


Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
清除 Cookies - 联系我们 - 中国Linux公社 - WAP