【发布时间】:2016-12-27 12:38:10
【问题描述】:
在第 10 章 APUE 的信号中。
我有一些关于sigprocmask()、SIG_BLOCK 和SIG_SETMASK 的问题。
- 书上说“我们在屏蔽信号时保存了旧面罩”。我的理解是:
我们声明一个sigset_t类型的newmask,然后sigempty(&newmask)表示初始化新掩码以便排除newmask指向的所有信号,最后将SIGQUIT添加到newmask集合中。
但我不确定以下是什么意思。是SIG_BLOCKnewmask和sigprocmask()指向的信号指向oldmask吗?
sigprocmask(SIG_BLOCK, &newmask, &oldmask)
- “为了解除对信号的阻塞,我们对旧掩码进行了
SIG_SETMASK。
oldmask 是一个包含SIGQUIT 的sigset_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;
}
非常感谢!
【问题讨论】: