APUE说
由于进程组在进行父节点化时是孤立的,因此POSIX.1要求每个进程都处于进程中 停止的新孤立进程组(如我们的孩子所有)被发送挂断信号(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,这对我来说非常混乱,你们可以帮助我吗?
提前感谢。
答案 0 :(得分:4)
在孩子的执行恢复之前,无法交付SIGHUP。当进程停止时,除SIGCONT和SIGKILL外,所有信号传递都将暂停。
因此,SIGHUP确实首先到达,但在SIGCONT唤醒进程执行之前无法处理。