《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信号的默认动作是终止该进程,所以必须提供一个信号处理程序以捕捉该信号。

2999

被折叠的 条评论
为什么被折叠?



