首页 文章

关于sigprocmask(),SIG_BLOCK和SIG_SETMASK

提问于
浏览
0

在APUE的第10章信号中 .

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

  • 这些书说"we saved the old mask when we blocked the signal" . 我的理解是:

我们声明 newmask 类型为 sigset_t ,然后 sigempty(&newmask) 表示初始化新掩码,以便排除 newmask 指向的所有信号,最后将 SIGQUIT 添加到 newmask 集 .

但我不确定以下是什么意思 . 它是 newmasksigprocmask() 指向 oldmask 的信号是 SIG_BLOCK 吗?

sigprocmask(SIG_BLOCK, &newmask, &oldmask)

  • “为了解锁信号,我们做了一个旧面具的 SIG_SETMASK .

oldmasksigset_t ,包含 SIGQUIT ,如何解锁信号( SIGQUIT )?

sigprocmask(SIG_SETMASK, &oldmask, NULL)

这是整个代码:

#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;
}

非常感谢!

1 回答

  • 1

    我们声明一个类型为sigset_t的新掩码,然后sigempty(&newmask)意味着初始化newmask,以便排除newmask指向的所有信号,最后将SIGQUIT添加到newmask集 .

    不完全是 . sigemptyset() 排除来自 newmask 的所有信号(即它是空信号集) .

    但我不确定以下是什么意思 . 是不是将新掩码和sigprocmask()指向的信号SIG_BLOCK到旧掩码?

    sigprocmask(SIG_BLOCK, &newmask, &oldmask) 使用 newmask 设置新信号掩码(即如果成功,则仅阻止 SIGQUIT )并返回 oldmask 中的旧信号掩码 .

    oldmask是一个包含SIGQUIT的sigset_t,如何解锁信号(SIGQUIT)?

    这不是真的 . 旧的信号掩码是 SIGQUIT 被阻止之前的那个,当你阻止 SIGQUIT 并存储在 oldmask 时,它被 sigprocmask() 返回 . 因此, sigprocmask(SIG_SETMASK, &oldmask, NULL) 恢复旧信号掩码(无论调用 sigprocmask(SIG_BLOCK, &newmask, &oldmask) 之前的信号掩码) .

相关问题