SIGCONT和SIGHUP命令发送给孤立的linux进程组

APUE说

由于进程组在父代终止时是孤立的,因此POSIX.1要求在新的孤立进程组中的每个进程(作为我们的subprocess)被发送挂起信号(SIGHUP),之后是继续信号(SIGCONT)

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> #define errexit(msg) do{ perror(msg); exit(EXIT_FAILURE); } while(0) static void sig_hup(int signo) { printf("SIGHUP received, pid = %d\n", getpid()); } static void sig_cont(int signo) { printf("SIGCONT received, pid = %d\n", getpid()); } static void sig_ttin(int signo) { printf("SIGTTIN received, pid = %d\n", getpid()); } static void pr_ids(char *name) { printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n", name, getpid(), getppid(), getpgrp(), tcgetpgrp(STDIN_FILENO)); } int main(int argc, char *argv[]) { char c; pid_t pid; setbuf(stdout, NULL); pr_ids("parent"); if ((pid = fork()) < 0) { errexit("fork error"); } else if (pid > 0) { /* parent */ sleep(5); printf("parent exit\n"); exit(0); } else { /* child */ pr_ids("child...1"); signal(SIGCONT, sig_cont); signal(SIGHUP, sig_hup); signal(SIGTTIN, sig_ttin); kill(getpid(), SIGTSTP); //sleep(10); pr_ids("child...2"); if (read(STDIN_FILENO, &c, 1) != 1) { printf("read error from controlling TTY, errno = %d\n", errno); } printf("child exit\n"); } exit(0); } 

程序输出:

父:pid = 2036,ppid = 1959,pgrp = 2036,tpgrp = 2036
孩子… 1:pid = 2037,ppid = 2036,pgrp = 2036,tpgrp = 2036
父母出口
xiejingfeng @ xiejingfeng-desktop:/ codes / apue $ SIGCONT收到,pid = 2037
收到SIGHUP,pid = 2037
孩子… 2:pid = 2037,ppid = 1,pgrp = 2036,tpgrp = 1959
从控制TTY读取错误,errno = 5
孩子出口

由于程序首先收到SIGCONT,然后SIGHUP,这对我来说非常困惑,你们能帮我一下吗?

提前致谢。

SIGHUP不能交付,直到孩子的执行恢复。 当一个进程停止时,除了SIGCONT和SIGKILL,所有的信号传递都被暂停。

所以,SIGHUP首先到达,但是直到SIGCONT唤醒流程执行才能处理。