首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于sigprocmask掩码()、SIG_BLOCK和SIG_SETMASK

关于sigprocmask掩码()、SIG_BLOCK和SIG_SETMASK
EN

Stack Overflow用户
提问于 2016-12-27 12:38:10
回答 1查看 8.7K关注 0票数 1

在第10章中,APUE的信号。

我有一些关于sigprocmask()SIG_BLOCKSIG_SETMASK的问题。

  1. 书上写着“当我们封锁信号时,我们保存了旧面具”。我的理解是:

我们声明一个newmask类型为sigset_t,然后sigempty(&newmask)意味着使新掩码无效,从而排除newmask所指向的所有信号,最后将SIGQUIT添加到newmask集合。

但我不知道以下是什么意思。是为了SIG_BLOCK newmasksigprocmask()所指向的信号到oldmask

sigprocmask(SIG_BLOCK, &newmask, &oldmask)

  1. “为了解除信号阻塞,我们做了一个旧面具的SIG_SETMASK

oldmask是一个包含SIGQUITsigset_t,如何解除信号阻塞(SIGQUIT)?

sigprocmask(SIG_SETMASK, &oldmask, NULL)

以下是整个代码:

代码语言:javascript
复制
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>

static void sig_quit(int signo) {
    printf("caught SIGQUIT\n");
    if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
        printf("can't reset SIGQUIT\n");
}

int main() {
    sigset_t newmask, oldmask, pendmask;

    if (signal(SIGQUIT, sig_quit) == SIG_ERR)
        printf("can't catch SIGQUIT\n");

    /* Block SIGQUIT and save current signal mask. */
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGQUIT);

    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
       printf("SIG_BLOCK error");
    sleep(5);   /* SIGQUIT here will remain pending */
    if (sigpending(&pendmask) < 0)
       printf("sigpending error");
    if (sigismember(&pendmask, SIGQUIT))
       printf("\nSIGQUIT pending\n");

    /* Restore signal mask which unblocks SIGQUIT. */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
       printf("SIG_SETMASK error");
    printf("SIGQUIT unblocked\n");
    sleep(5);   /* SIGQUIT here will terminate with core file */

    return 0;
}

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-27 12:51:40

我们声明一个sigset_t类型的新掩码,然后σ空(&new掩码)意味着使新掩码无效,从而排除新掩码所指向的所有信号,最后将SIGQUIT添加到新掩码集中。

不完全同意。sigemptyset()排除了newmask中的所有信号(即它是一个空信号集)。

但我不知道以下是什么意思。它是要将新掩码和Sigpro掩码()所指向的信号SIG_BLOCK到旧掩码吗?

sigprocmask(SIG_BLOCK, &newmask, &oldmask)使用newmask设置新的信号掩码(如果成功,只有SIGQUIT被阻塞),并在oldmask中返回旧的信号掩码。

旧掩码是包含SIGQUIT的sigset_t,它如何解除信号阻塞(SIGQUIT)?

那是胡说。旧的信号掩码是SIGQUIT被阻塞之前的信号掩码,当您阻止SIGQUIT并存储在oldmask中时,该掩码由sigprocmask()返回。因此,sigprocmask(SIG_SETMASK, &oldmask, NULL)恢复旧的信号掩码(无论调用sigprocmask(SIG_BLOCK, &newmask, &oldmask)之前的信号掩码是什么)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41345375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档