编写简单的程序来学习编写 POSIX 风格的信号处理。
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
static void sig_int(int);
int
main(void)
{
sigset_t waitmask;
if (signal(SIGINT, sig_int) == SIG_ERR) {
printf("error occured\n");
exit(1);
}
sigemptyset(&waitmask);
sigaddset(&waitmask, SIGUSR1);
if (sigsuspend(&waitmask) != -1) {
printf("error\n");
exit(1);
}
}
static void
sig_int(int signo)
{
sigset_t sigset;
sigprocmask(0, NULL, &sigset);
if (sigismember(&sigset, SIGINT))
printf("SIGINT\n");
if (sigismember(&sigset, SIGUSR1))
printf("SIGUSR1\n");
}
我创建了空信号集。
然后我将 SIGUSR 添加到信号集中。
安装信号处理程序
当我启动程序并且它暂停等待信号时,我生成 SIGINT,处理程序打印 SIGINT 也是 sigset 的成员,这似乎是非常奇怪的行为。
为什么 sigismember 认为 SIGINT 是 sigset 的成员,尽管它没有用 sigaddset(&waitmask, SIGINT) 明确添加?
答案1
如果配置设置为函数,那么首先 处置被重置为 SIG_DFL,或者 信号被阻挡 (看 可移植性如下),然后调用处理程序带有参数 signum。 如果处理程序的调用导致信号被阻塞,那么 信号从处理程序返回后即解除阻塞。