clm615 发表于 2007-8-11 22:49:03

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 发表于 2007-8-13 17:12:33

晕哦,问题太弱,没人愿意回答吗

kennethjia 发表于 2007-8-16 17:17:04

是绕口了。
其实 shell 和 ed (可能是孙子进程)都是 a.out 的子进程,
不过system API不应该影响整个程序,要让用户觉得system完成它的工作
而且没有别的事情要做。
如果不是父进程中该信号的递送应当阻塞, 会影响a.out 处理其他子进程 .

clm615 发表于 2007-8-17 08:40:41

感谢kennethjia 的回复,然我好激动啊,虽然还是有点看不懂,起码有点思路了。谢谢哈
页: [1]
查看完整版本: system函数