分类: LINUX
2008-11-05 16:29:09
孤儿进程组:改组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。
一个进程组不是孤儿进程组条件是,该组中有一个进程其父进程在属于同一个会话的另一个组中。
POSIX.1要求向孤儿进程组中处于停止状态的每一个进程发送挂断信号(SIGHUP)接着又向其发送继续信号(SIGCONT)。
在处理挂断信号后,子进程继续。对于挂断信号系统默认是终止该进程,为此我们提供一个信号处理程序以捕捉该信号。
下面的代码创建了一个孤儿进程组,并且可以看到上面的这个处理过程。
|
$ a . o u t
parent: pid = 512, ppid = 442, pgrp = 512,tpgrp = 512
child: pid = 513, ppid = 512, pgrp = 512, tpgrp = 512
$ SIGHUP received, pid = 513
child: pid = 513, ppid = 1, pgrp = 512,tpgrp = 442
read error from control terminal, errno = 5
我自己测试输出和书上差不多,上面是复制书上的输出
稍微理解一下这个输出:
首先父进程ID是512,他的父进程是登录shell,ID是442,进程组ID512,前台进程组ID512
子进程ID是513,父进程是上面的512,进程组ID也是512,前台进程组ID512
这轮输出后,子进程停止了,然后父进程exit,为了保证先后,父进程调用sleep(5)
然后父进程退出后,子进程所属的进程组变成孤儿进程组,
这时系统向孤儿发送SIGHUP信号,子进程输出,其他一样,就是父进程变成init(ID 1),而且前台进程组ID变成442,也就是登录shell进程组变成前台进程组。
最后因为这时子进程已经到了后台所以read STDIN_FILENO不行,报错。