【问题标题】:order of SIGCONT and SIGHUP sent to orphaned linux process groupSIGCONT 和 SIGHUP 的顺序发送到孤立的 linux 进程组
【发布时间】:2013-07-20 01:25:49
【问题描述】:

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,这对我来说很困惑,你们能帮帮我吗?

提前致谢。

【问题讨论】:

    标签: c linux unix process signals


    【解决方案1】:

    在子进程恢复执行之前,无法传递 SIGHUP。当进程停止时,除了 SIGCONT 和 SIGKILL 之外的所有信号传递都将暂停。

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

    【讨论】:

    • 非常感谢!这是相当微妙的,因为这本书没有解释
    • @Tracy,不客气。如果答案有帮助,请毫不犹豫地投票和/或接受它,谢谢。
    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多