- 论坛徽章:
- 0
|
本帖最后由 pang68599 于 2014-10-22 20:50 编辑
UNIX Like 中 在父进程终止后,进程组成为孤儿进程组,POSIX.1要求向新的孤儿进程组中处于停止状态的每一个进程发送挂断信号(SIGHUP),接着又向其发送继续信号(SIGCONT)。
我验证下不是只向孤儿进程组中的停止进程发送SIGHUP信号,孤儿进程组的所有进程都能收到SIGHUP信号,不知道是不是我理解错了。
下面是我的实验代码不知道是不是我理解错误了?- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <setjmp.h>
- #include <termios.h>
- void sig_hup1(int signo) {
- printf("no:%d,pid:%d,ppid:%d\n",signo,getpid(),getppid());
- _exit(0);
- }
- int chapter9_5() {
-
- pid_t pid = 0;
-
- if(0 > (pid = fork())) {
- printf("error\n");
- }else if(0 == pid){
-
- if(0 > (pid = fork())) {
- printf("error\n");
- }else if(0 == pid){
- signal(SIGHUP,sig_hup1);
- printf("cc1 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
- while (1) ;
-
- exit(0);
- }
- signal(SIGHUP,sig_hup1);
- printf("c1 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
- exit(0);
- }
- if(0 > (pid = fork())) {
- printf("error\n");
- }else if(0 == pid){
- if(0 > (pid = fork())) {
- printf("error\n");
- }else if(0 == pid){
- signal(SIGHUP,sig_hup1);
- printf("cc2 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
- while (1) ;
-
- exit(0);
- }
- signal(SIGHUP,sig_hup1);
- kill(getpid(),SIGSTOP);
-
- printf("c2 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
- while (1) ;
- exit(0);
- }
- sleep(10);
- printf("f1 pid[%d],ppid[%d],tc[%d],pgrg[%d],sid[%d]\n",getpid(),getppid(),tcgetpgrp(STDIN_FILENO),getpgrp(),getsid(0));
- return 0;
- }
复制代码 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
|
|