- 论坛徽章:
- 4
|
楼主AIX很神奇, 我表示怎么分析也分析不出来有理由SIGHUP, 因为子进程不在孤儿进程组里.
简单的注释了一下, 楼主再分析分析, 看有什么区别, 反正linux下是和楼主的结果不同:- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <signal.h>
- #include <errno.h>
- #include <string.h>
- void signHand(int sign)
- {
- printf("pid[%d]sign[%d] received----YHB\n", getpid(), sign);
- if (sign == SIGHUP )
- {
- printf("register SIGTTIN\n");
- if( signal(SIGTTIN, signHand) == SIG_ERR)
- {
- printf("Cant register SIG\n");
- }
- }
- }
- int main()
- {
- setbuf(stdout,NULL);
- printf("main: %d %d\n", getpid(), getpgrp());
-
- pid_t pid = fork();
-
- if(pid < 0) {
- perror("fork");
- return 1;
- }
- //父进程将子进程的组设置为子进程的pid, 也就是子进程新进入了一个进程组
- //子进程执行这句毫无效果, 虽然和父进程执行有竞争, 但没有实际效果, 想到于setpgid(0, 0);
- setpgid(pid, 0);
- printf("pid=%d gid=%d cccc", getpid(), getpgrp());
- if(pid >0) {
- printf("parent begin to 10 seconds\n");
- sleep(2);
- printf("parent let child come back\n");
- //父进程又把子进程恢复到父进程的进程组里
- //但你要知道子进程此刻一定是进程组长, 一个进程组长离开了进程组而已, 并且父进程组也不是孤儿组, 没理由SIGHUP啊
- printf("setpgid[%d][%d][%s]\n", setpgid(pid, getpgrp()), errno, strerror(errno));
- printf("parent begin to 20 seconds\n");
- sleep(2);
- printf("parent let child continue\n");
- kill(pid, SIGCONT);
- printf("parent wait child\n");
- waitpid(pid,NULL,0);
- printf("parent exit\n");
- return 0;
- }
- char buf[1024];
- printf("child: %d %d\n", getpid(), getpgrp());
- if (signal(SIGHUP, signHand) == SIG_ERR)
- {
- printf("Cant register SIG\n");
- return -1;
- }
- if (signal(SIGCONT, signHand) == SIG_ERR)
- {
- printf("Cant register SIG\n");
- return -1;
- }
- //这里你可以看到, 子进程的确又回到了父进程的组
- while(fgets(buf,1024, stdin)){
- printf("child.PID[%d].PGID[%d]>", getpid(), getpgrp());
- fputs(buf, stdout);
- }
- printf("child exit\n");
- return 0;
- }
复制代码 |
|