孤儿进程组

孤儿进程组定义为:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。 如果某个进程终止,使得某个进程组成为孤儿进程组的话,系统会向孤儿进程组里面每个处于停止状态进程发送一个SIGHUP信号, 然后发送SIGCONT信号。

#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>


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


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


int main()
{
    pr_ids("parent");


    pid_t pid;
    pid = fork();
    if ((pid)==0)
    {   
        pr_ids("child");
        signal(SIGHUP, sig_hup);
        kill(getpid(), SIGTSTP);
        pr_ids("child");
        char c;
        if (read(STDIN_FILENO, &c, sizeof(c))==-1)
        {   
            printf("read from tty error, errno=%m\n");
        }   
        exit(0);
    }   
    else
    {   
        sleep(3);
        exit(0);
        printf("parent exit\n");
    }   
}

./ger 

parent:pid=31037, ppid=12525, pgrp=31037,tpgrp=31037

child:pid=31038, ppid=31037, pgrp=31037,tpgrp=31037

SIGHUP received, pid=31038 //确实接收到了

child:pid=31038, ppid=1, pgrp=31037,tpgrp=31037 //但是SIGCONT被换到了前台进程了,所以tpgrp还是31037并且可读



你可能感兴趣的:(孤儿进程组)