linux孤儿进程组深入理解,《APUE》:创建一个孤儿进程组

《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu 10.04上测试通过。

相关链接

//《APUE》程序9-1:创建一个孤儿进程组

#include 

#include 

#include 

#include 

#include 

//输出错误信息并退出

voiderror_quit(constchar*str)

{

fprintf(stderr,"%s\n", str);

exit(1);

}

//处理SIGHUP信号

staticvoidsig_hup(intsigno)

{

printf("SIGHUP received, pid = %d\n", getpid());

}

staticvoidpr_ids(char*name)

{

printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n",

name, getpid(), getppid(), getpgid(), tcgetpgrp(STDIN_FILENO));

fflush(stdout);

}

intmain()

{

charc;

pid_t pid;

pr_ids("parent");

pid = fork();

if( pid 

error_quit("fork error");

elseif( pid > 0 )

{

sleep(5);

return0;

}

else

{

pr_ids("child");

signal(SIGHUP, sig_hup);

kill(getpid(), SIGTSTP);

pr_ids("child");

//这里和书上说的不同,read函数能正常运行,不会发生错误(Ubuntu10.04)

inttemp = read(STDIN_FILENO, &c, 1);

if( temp != 1 )

{

printf("read error from controlling TTY, "

"errno = %d\n", errno);

}

return0;

}

}

运行示例(红色字体的为输入):

www.linuxidc.com @ubuntu:~/code$ gcc temp.c -o temp

www.linuxidc.com @ubuntu:~/code$ ./tempparent: pid = 3311, ppid = 3241, pgrp = 3311, tpgrp = 3311

child: pid = 3312, ppid = 3311, pgrp = 3311, tpgrp = 3311

SIGHUP received, pid = 3312

child: pid = 3312, ppid = 1, pgrp = 3311, tpgrp = 3311

程序说明:

1:首先让父进程休眠5秒钟,让子进程在父进程终止之前运行。

2:子进程为SIGHUP信号建立信号处理程序,用于观察SIGHUP信号是否已经发送到子进程。

3:子进程用kill函数向自身发送SIGTSTP信号,模拟用终端停止一个前台作业。

4:父进程终止时,该子进程成为了一个孤儿进程,ppid=1。

5:现在,子进程成为一个孤儿进程组的成员。

6:父进程停止后,进程组成为了孤儿进程组,父进程会向新的孤儿进程组中处于停止状态的每个进程发送SIGHUP信号,接着又向其发送SIGCONT信号。

7:在处理了SIGHUP信号之后,子进程继续。对SIGHUP信号的默认动作是终止该进程,所以必须提供一个信号处理程序以捕捉该信号。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值