zoukankan      html  css  js  c++  java
  • APUE学习笔记——第十章信号中10.15节例程的运行结果与书本里的不一样

    1.程序

    #include "apue.h"
    #include <setjmp.h>
    #include <time.h>

    static sigjmp_buf jmpbuf;
    static volatile sig_atomic_t canjump;
    void pr_mask(const char *str)
    {
    sigset_t sigset;
    int errno_save;

    errno_save = errno;
    if (sigprocmask(0, NULL, &sigset) < 0)
    err_sys("sigprocmask error");

    printf("%s", str);

    if (sigismember(&sigset, SIGINT)) printf("SIGINT");
    if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT");
    if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1");
    if (sigismember(&sigset, SIGALRM)) printf("SIGALRM");

    printf(" ");

    errno = errno_save;
    }

    static void sig_usr1(int signo)
    {
    time_t starttime;
    if (canjump == 0)
    return ;

    pr_mask("starting sig_usr1:");
    alarm(3);
    starttime = time(NULL);
    for (;;)
    if (time(NULL) > starttime + 5)
    break;
    pr_mask("finishing sig_usr1:");
    canjump = 0;
    siglongjmp(jmpbuf, 1);
    }

    static void sig_alrm(int signo)
    {
    pr_mask("int sig_alrm: ");
    }

    int main(void)
    {
    if (signal(SIGUSR1, sig_usr1) == SIG_ERR)
    err_sys("signal(SIGUSR1) error");

    if (signal(SIGALRM, sig_alrm) == SIG_ERR)
    err_sys("signal(SIGALRM) error");

    pr_mask("starting main: ");

    if (sigsetjmp(jmpbuf, 1))
    {
    pr_mask("ending main: ");
    exit(0);
    }
    canjump = 1;
    for (;;)
    pause();
    }

    2.结果

    xiaoheng@ubuntuxh:~/Program/apue/apue10/1010$ ./1015 &
    [1] 18966
    xiaoheng@ubuntuxh:~/Program/apue/apue10/1010$ starting main:
    kill -USR1 18966
    starting sig_usr1:
    xiaoheng@ubuntuxh:~/Program/apue/apue10/1010$ int sig_alrm:
    finishing sig_usr1:
    ending main:

    没有打印SIGUSR1跟SIGALRM

  • 相关阅读:
    机械学习--5
    机械学习--4
    机械学习--3
    机械学习--2
    机器学习--1
    编译原理 作业十五
    编译原理 作业十四
    编译原理 作业十二
    编译原理 作业十一
    编译原理 作业十
  • 原文地址:https://www.cnblogs.com/xiaoheng008/p/3735841.html
Copyright © 2011-2022 走看看