APUE 第三版 程序 9-12 (创建孤儿进程组)

如有错误,欢迎批评指正,本人也是才学APUE的菜鸟
 
孤儿进程组的定义:该进程组的每个成员的父进程要么是该组的成员,要么在其它会话中。
 
孤儿进程组的特点

  1. 如果一个进程组包含一个或一个以上的停止的进程,当该进程组变成孤儿进程组时,该进程组中的每一个进程都会接收到一个 SIGHUP (挂掉)信号,然后紧接着会接收到 SIGCONT (继续)信号。
    但是对挂断信号的系统默认动作是终止该进程。所以,如果要继续执行子进程,就必须提供一个信号处理程序以捕捉该信号。

  2. 孤儿进程组是后台进程组

  3. 孤儿进程组去读控制终端时,read返回出错并将errno设置为EIO。
    只有前台作业能接收终端输入,如果后台作业试图读终端,那么这并不是一个错误,但是终端驱动程序将检测到这种情况,并且向后台作业发送一个特定的信号SIGTTIN。该信号通常会暂时停止此后台作业。由于孤儿进程组是后台进程组,如果内核用SIGTTIN信号停止它,那么进程组中的进程就再也不会继续了。

 
  至于书中说:父进程在终止时,子进程变成了后台进程组,因为父进程是由 shell 作为前台作业执行的。不懂什么意思,有没有老哥解释一下,为什么会变成后台进程组。
 
 
  程序 9-12代码:

#include "apue.h"
#include <errno.h>

static void sig_hup(int signo) {
	printf("SIGHUP received, pid = %ld\n", (long) getpid());
}

static void pr_ids(char *name) {
	printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n",
		name, (long) getpid(), (long) getppid(), (long) getpgrp(), (long) tcgetpgrp(STDIN_FILENO));
	fflush(stdout);
}

int main(void) {
	char c;
	pid_t pid;

	pr_ids("parent");
	if((pid = fork()) < 0)
		err_sys("fork error");
	else if(pid > 0)
		sleep(5);
	else {
		pr_ids("child");
		signal(SIGHUP, sig_hup);
		kill(getpid(), SIGTSTP);
		pr_ids("child");
		if(read(STDIN_FILENO, &c, 1) != 1)
			printf("read error %d on controlling TTY\n", errno);
	}
	exit(0);
}

终端运行如下:

hjm@hjm-Inspiron:~$ ./9-12
parent: pid = 2792, ppid = 2758, pgrp = 2792, tpgrp = 2792
child: pid = 2793, ppid = 2792, pgrp = 2792, tpgrp = 2792
SIGHUP received, pid = 2793
child: pid = 2793, ppid = 1, pgrp = 2792, tpgrp = 2758
read error 5 on controlling TTY

【析】:
由输出可知,起初 child 属于一个前台进程组。当其父进程结束时,该子进程的进程组成为了孤儿进程组,后台进程组。

   它试图对读标准输入,正常情况下,将对该后台进程组产生 SIGTTIN 信号,该信号会停止此后台作业。!但是这是一个孤儿进程组,如果内核用SIGTTIN信号停止它,那么进程组中的进程就再也不会继续了。所以 POSIX.1 对这种情况下的处理是,read 返回出错,并将 errno 设置为 5.
   

   至于孤儿进程组的输出,这个取决于是否禁止后台作业输出到控制终端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值