程序清单 9-1 创建一个孤儿进程组 P229
/**
* 程序清单 9-1 创建一个孤儿进程组 P229
*
* zy:
* 注意这里是孤儿进程组,是整个进程组都是孤儿,
* 我们一般称一个父进程已经终止的进程为孤儿进程,这种进程将会被init进程收养
*
* 孤儿进程组的定义还是比较绕的,如下:
* 如果该组成员的父进程要么是同一个组的成员,要么是不是该组所属会话的成员。
*
* 不是孤儿进程组的条件:
* 该组中有一个进程,其父进程是属于同一个会话的另一个组
*
* 书上到也没有讲孤儿进程组有什么用
*/
#include "error.c"
#include "apue.h"
#include <errno.h>
static void sig_hug(int signo){
printf("SIGHUP recevied,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)); //得到前台进程id
}
int main() {
char c;
pid_t pid;
pr_ids("parent");
if((pid=fork())<0)
err_sys("fork error");
else if(pid!=0){//parent
sleep(5);
exit(0);
}else{
pr_ids("child");
signal(SIGHUP,sig_hug);
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);
}
}
结果,符合预期,和书上的解释完全想对应:
asd@asd-desktop:~/workspace/test/src$ ./a.out
parent:pid=4458,ppid=3329,pgrp=4458,tpgrp=4458
child:pid=4459,ppid=4458,pgrp=4458,tpgrp=4458
SIGHUP recevied,pid=4459
child:pid=4459,ppid=1,pgrp=4458,tpgrp=3329
read error from controlling TTY,errno=5
asd@asd-desktop:~/workspace/test/src$