2013-07-21 30 views
1

APUE說爲了SIGCONT和SIGHUP發送到Linux的孤兒進程組

由於處理組是孤立的,當parentterminates,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桌面:/代碼/ APUE $ SIGCONT收到,PID = 2037
SIGHUP收到,PID = 2037
孩子... 2:PID = 2037,PPID = 1,PGRP = 2036,tpgrp = 1959年
從控制TTY讀取錯誤,errno = 5
子出口

由於程序首先收到SIGCONT,然後SIGHUP,這對我來說很困惑,你們可以幫我解決這個問題嗎?

在此先感謝。

回答

3

SIGHUP無法交付,直到孩子的執行恢復。當進程停止時,除了SIGCONT和SIGKILL之外,所有的信號傳遞都將暫停。

因此,SIGHUP首先到達,但是直到SIGCONT喚醒流程執行才能處理它。

+0

非常感謝!這是相當微妙的,因爲這本書沒有解釋 – Tracy

+1

@ Tracy,不客氣。如果答案是有幫助的,請不要猶豫,立即投票和/或接受它,謝謝。 – pilcrow