首页 文章

将SIGCONT和SIGHUP的顺序发送给孤立的linux进程组

提问于
浏览
1

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);
  }

程序输出:

parent:pid = 2036,ppid = 1959,pgrp = 2036,tpgrp = 2036 child ... 1:pid = 2037,ppid = 2036,pgrp = 2036,tpgrp = 2036 parent exit xiejingfeng @ xiejingfeng-desktop:/ codes /收到apue $ SIGCONT,收到pid = 2037 SIGHUP,pid = 2037 child ... 2:pid = 2037,ppid = 1,pgrp = 2036,tpgrp = 1959从控制TTY读取错误,errno = 5子退出

输出不是预期的,因为程序首先收到SIGCONT然后是SIGHUP,这对我来说非常混乱,你能帮助我吗?

提前致谢 .

1 回答

  • 4

    在孩子的执行恢复之前,不能交付SIGHUP . 当进程停止时,除SIGCONT和SIGKILL外,所有信号传递都将暂停 .

    因此,SIGHUP确实首先到达,但在SIGCONT唤醒进程执行之前无法处理 .

相关问题