QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2692|回复: 3

system函数

[复制链接]
发表于 2007-8-11 22:49:03 | 显示全部楼层 |阅读模式
在看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没收到信号啊?
 楼主| 发表于 2007-8-13 17:12:33 | 显示全部楼层
晕哦,问题太弱,没人愿意回答吗
回复

使用道具 举报

发表于 2007-8-16 17:17:04 | 显示全部楼层
是绕口了。
其实 shell 和 ed (可能是孙子进程)都是 a.out 的子进程,
不过system API不应该影响整个程序,要让用户觉得system完成它的工作
而且没有别的事情要做。
如果不是父进程中该信号的递送应当阻塞, 会影响a.out 处理其他子进程 .
回复

使用道具 举报

 楼主| 发表于 2007-8-17 08:40:41 | 显示全部楼层
感谢kennethjia 的回复,然我好激动啊,虽然还是有点看不懂,起码有点思路了。谢谢哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 00:39 , Processed in 0.037962 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表