3

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
child...2: pid = 2037、ppid = 1、pgrp = 2036、tpgrp = 1959
制御 TTY からの読み取りエラー、errno = 5
子出口

プログラムは最初に SIGCONT を受け取り、次に SIGHUP を受け取るため、本に書かれているように出力は期待されません。

前もって感謝します。

4

1 に答える 1

6

子の実行が再開されるまで、SIGHUP を配信することはできません。プロセスが停止すると、SIGCONT と SIGKILL を除くすべてのシグナル配信が中断されます。

そのため、SIGHUP が最初に到着しますが、SIGCONT がプロセスの実行を呼び起こすまで処理できません。

于 2013-07-21T05:15:14.460 に答える