Chinaunix首页 | 论坛 | 博客
  • 博客访问: 850990
  • 博文数量: 213
  • 博客积分: 5048
  • 博客等级: 大校
  • 技术积分: 1883
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 10:14
文章分类

全部博文(213)

文章存档

2011年(4)

2010年(55)

2009年(47)

2008年(107)

我的朋友

分类: LINUX

2008-11-05 16:29:09

孤儿进程组:改组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。

一个进程组不是孤儿进程组条件是,该组中有一个进程其父进程在属于同一个会话的另一个组中。

 

POSIX.1要求向孤儿进程组中处于停止状态的每一个进程发送挂断信号(SIGHUP)接着又向其发送继续信号(SIGCONT)。

在处理挂断信号后,子进程继续。对于挂断信号系统默认是终止该进程,为此我们提供一个信号处理程序以捕捉该信号。

下面的代码创建了一个孤儿进程组,并且可以看到上面的这个处理过程。

 

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

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

static void
pr_ids(char *name)
{
    printf("%s: pid = %d,ppid = %d,pgrp = %d,tpgrp = %d\n",
    name, getpid(), getppid(), getpgrp(),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);
        exit(0);
    } else {
        pr_ids("child");
        signal(SIGHUP, sig_hup);
        kill(getpid(), SIGTSTP);
        pr_ids("child");
        if (read(STDIN_FILENO, &c, 1) != 1)
            printf("read error from controlling TTY,errno = %d\n",errno);
        exit(0);
    }
}

 

$ 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不行,报错。

阅读(1524) | 评论(0) | 转发(0) |
0

上一篇:进程关系-一些概念理解

下一篇:signal函数

给主人留下些什么吧!~~