Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 《APUE》:创建一个孤儿进程组

《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu 10.04上测试通过。相关链接
  • 《UNIX环境高级编程》(第二版)apue.h的错误 http://www.linuxidc.com/Linux/2011-04/34662.htm
  • Unix环境高级编程 源代码地址 http://www.linuxidc.com/Linux/2011-04/34826.htm
  1. //《APUE》程序9-1:创建一个孤儿进程组   
  2. #include <stdio.h>   
  3. #include <unistd.h>   
  4. #include <errno.h>   
  5. #include <signal.h>   
  6. #include <stdlib.h>   
  7.   
  8. //输出错误信息并退出     
  9. void error_quit(const char *str)    
  10. {    
  11.     fprintf(stderr, "%s ", str);    
  12.     exit(1);    
  13. }  
  14.   
  15. //处理SIGHUP信号   
  16. static void sig_hup(int signo)  
  17. {  
  18.     printf("SIGHUP received, pid = %d ", getpid());  
  19. }  
  20.   
  21. static void pr_ids(char *name)  
  22. {  
  23.     printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d ",  
  24.         name, getpid(), getppid(), getpgid(), tcgetpgrp(STDIN_FILENO));  
  25.     fflush(stdout);  
  26. }  
  27.   
  28. int main()  
  29. {  
  30.     char c;  
  31.     pid_t pid;  
  32.   
  33.     pr_ids("parent");  
  34.     pid = fork();  
  35.     if( pid < 0 )  
  36.         error_quit("fork error");  
  37.     else if( pid > 0 )  
  38.     {  
  39.         sleep(5);  
  40.         return 0;  
  41.     }  
  42.     else  
  43.     {  
  44.         pr_ids("child");  
  45.         signal(SIGHUP, sig_hup);  
  46.         kill(getpid(), SIGTSTP);  
  47.         pr_ids("child");  
  48.   
  49.         //这里和书上说的不同,read函数能正常运行,不会发生错误(Ubuntu10.04)   
  50.         int temp = read(STDIN_FILENO, &c, 1);  
  51.         if( temp != 1 )  
  52.         {  
  53.             printf("read error from controlling TTY, "  
  54.                 "errno = %d ", errno);  
  55.         }  
  56.         return 0;  
  57.     }  
  58. }  
运行示例(红色字体的为输入):www.linuxidc.com @ubuntu:~/code$ gcc temp.c -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp
parent: 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信号的默认动作是终止该进程,所以必须提供一个信号处理程序以捕捉该信号。