在第10章中,APUE的信号。
我有一些关于sigprocmask(),SIG_BLOCK和SIG_SETMASK的问题。
我们声明一个newmask类型为sigset_t,然后sigempty(&newmask)意味着使新掩码无效,从而排除newmask所指向的所有信号,最后将SIGQUIT添加到newmask集合。
但我不知道以下是什么意思。是为了SIG_BLOCK newmask和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;
}非常感谢!
发布于 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)之前的信号掩码是什么)。
https://stackoverflow.com/questions/41345375
复制相似问题