gpt4 book ai didi

c - 关于 sigprocmask()、SIG_BLOCK 和 SIG_SETMASK

转载 作者:行者123 更新时间:2023-11-30 15:01:34 25 4
gpt4 key购买 nike

在第 10 章 APUE 信号中。

我对 sigprocmask()SIG_BLOCKSIG_SETMASK 有一些疑问。

  1. 书上说“我们在屏蔽信号时保存了旧面具”。我的理解是:

我们声明一个sigset_t类型的newmask,那么sigempty(&newmask)的意思是初始化newmask,以便指向的所有信号>newmask 被排除,最后将 SIGQUIT 添加到 newmask 集合中。

但是我不确定以下是什么意思。是否将SIG_BLOCKnewmasksigprocmask()指向的信号指向oldmask

sigprocmask(SIG_BLOCK, &newmask, &oldmask)

  • “为了解锁信号,我们对旧掩码执行了 SIG_SETMASK
  • oldmask是一个包含SIGQUITsigset_t,这如何解锁信号(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;
    }

    非常感谢!

    最佳答案

    We declare a newmask of type sigset_t, then sigempty(&newmask) means to initalize the newmask so that all signals pointed by newmask are excluded, finally add SIGQUIT to the newmask set.

    不完全是。 sigemptyset() 排除来自 newmask所有信号(即,它是信号集)。

    But I'm not sure what the following means. Is it to SIG_BLOCK the the signals pointed by newmask and sigprocmask() them to the oldmask?

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

    The oldmask is a sigset_t containing SIGQUIT, how can this unblock the signal(SIGQUIT)?

    这不是真的。 信号掩码是之前SIGQUIT被阻止的信号掩码,它是在你阻止时由sigprocmask()返回的SIGQUIT 并存储在 oldmask 中。因此,sigprocmask(SIG_SETMASK, &oldmask, NULL) 恢复旧的信号掩码(无论调用sigprocmask(SIG_BLOCK, &newmask, &oldmask)<之前的信号掩码是什么)/)。

    关于c - 关于 sigprocmask()、SIG_BLOCK 和 SIG_SETMASK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41345375/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com