- 論壇徽章:
- 4
|
樓主AIX很神奇, 我表示怎么分析也分析不出來有理由SIGHUP, 因?yàn)樽舆M(jìn)程不在孤兒進(jìn)程組里.
簡單的注釋了一下, 樓主再分析分析, 看有什么區(qū)別, 反正linux下是和樓主的結(jié)果不同:- #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;
- }
- //父進(jìn)程將子進(jìn)程的組設(shè)置為子進(jìn)程的pid, 也就是子進(jìn)程新進(jìn)入了一個(gè)進(jìn)程組
- //子進(jìn)程執(zhí)行這句毫無效果, 雖然和父進(jìn)程執(zhí)行有競爭, 但沒有實(shí)際效果, 想到于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");
- //父進(jìn)程又把子進(jìn)程恢復(fù)到父進(jìn)程的進(jìn)程組里
- //但你要知道子進(jìn)程此刻一定是進(jìn)程組長, 一個(gè)進(jìn)程組長離開了進(jìn)程組而已, 并且父進(jì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;
- }
- //這里你可以看到, 子進(jìn)程的確又回到了父進(jìn)程的組
- while(fgets(buf,1024, stdin)){
- printf("child.PID[%d].PGID[%d]>", getpid(), getpgrp());
- fputs(buf, stdout);
- }
- printf("child exit\n");
- return 0;
- }
復(fù)制代碼 |
|