免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1134 | 回复: 4

[内核入门] 【跪求解答】孤儿进程组SIGHUP信号问题 [复制链接]

论坛徽章:
0
发表于 2014-10-22 20:42 |显示全部楼层
本帖最后由 pang68599 于 2014-10-22 20:50 编辑

UNIX Like 中 在父进程终止后,进程组成为孤儿进程组,POSIX.1要求向新的孤儿进程组中处于停止状态的每一个进程发送挂断信号(SIGHUP),接着又向其发送继续信号(SIGCONT)。
我验证下不是只向孤儿进程组中的停止进程发送SIGHUP信号,孤儿进程组的所有进程都能收到SIGHUP信号,不知道是不是我理解错了。
下面是我的实验代码不知道是不是我理解错误了?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <signal.h>
  6. #include <setjmp.h>
  7. #include <termios.h>

  8. void sig_hup1(int signo) {
  9.     printf("no:%d,pid:%d,ppid:%d\n",signo,getpid(),getppid());
  10.     _exit(0);
  11. }
  12. int chapter9_5() {
  13.    
  14.     pid_t pid = 0;
  15.    
  16.     if(0 > (pid = fork())) {
  17.         printf("error\n");
  18.     }else if(0 == pid){
  19.         
  20.         if(0 > (pid = fork())) {
  21.             printf("error\n");
  22.         }else if(0 == pid){
  23.             signal(SIGHUP,sig_hup1);
  24.             printf("cc1 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
  25.             while (1) ;
  26.             
  27.             exit(0);
  28.         }
  29.         signal(SIGHUP,sig_hup1);
  30.         printf("c1 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
  31.         exit(0);
  32.     }

  33.     if(0 > (pid = fork())) {
  34.         printf("error\n");
  35.     }else if(0 == pid){

  36.         if(0 > (pid = fork())) {
  37.             printf("error\n");
  38.         }else if(0 == pid){
  39.             signal(SIGHUP,sig_hup1);
  40.             printf("cc2 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
  41.             while (1) ;
  42.             
  43.             exit(0);
  44.         }
  45.         signal(SIGHUP,sig_hup1);
  46.         kill(getpid(),SIGSTOP);
  47.         
  48.         printf("c2 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
  49.         while (1) ;
  50.         exit(0);
  51.     }
  52.     sleep(10);
  53.     printf("f1 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
  54.     return 0;
  55. }
复制代码
f1 -- (fork) -+--- c1 ---(fork) --- cc1
                   |--- c2 ---(fork) --- cc2
c1先结束,后f1结束,c2停止,但是c2,cc1,cc2都收到了SIGHUP信号


输出:

c1 pid[2437],ppid[2436],tc[2436],pgrg[2436],sid[942]
cc1 pid[2439],ppid[2437],tc[2436],pgrg[2436],sid[942]
cc2 pid[2440],ppid[2438],tc[2436],pgrg[2436],sid[942]
f1 pid[2436],ppid[943],tc[2436],pgrg[2436],sid[942]
no:1,pid:2439,ppid:1
no:1,pid:2440,ppid:2438
no:1,pid:2438,ppid:1

论坛徽章:
0
发表于 2014-10-22 20:49 |显示全部楼层
跪求大侠帮解答啊

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2014-10-24 07:43 |显示全部楼层
f1是进程组长
f1终止,向同组成员cc1,c2,cc2发送SIGHUP

论坛徽章:
0
发表于 2014-10-26 09:35 |显示全部楼层
没错啊,书上只是没有详细说而已。如果某个进程组成成为孤儿进程组,并且此孤儿进程组里面有处于stop状态的进程,那么会向此进程组先发送SIGHUP信号,再发送SIGCONT(是这样拼写的吧……)如果进程没有定义对SIGHUP信号的处理函数,那就妥妥的挂了

论坛徽章:
0
发表于 2014-11-03 18:44 |显示全部楼层
王华_ 发表于 2014-10-26 09:35
没错啊,书上只是没有详细说而已。如果某个进程组成成为孤儿进程组,并且此孤儿进程组里面有处于stop状态的 ...

明白了 谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP