【Linux】详解信号的保存&&信号屏蔽字的设置
在Linux中,信号的保存和屏蔽是通过信号掩码(signal mask)来实现的。信号掩码是一个位掩码,每个位对应一个信号,当处理一个信号时,对应的位会被设置,表示信号被“阻塞”或“保存”。
可以使用sigset_t
数据类型来操作信号掩码,以及sigprocmask
和sigpending
函数来查看和修改信号掩码。
以下是一个简单的例子,演示如何设置信号屏蔽字,并查看信号是否被保存:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle_sig(int sig) {
printf("Caught signal %d\n", sig);
}
int main() {
sigset_t sigset;
// 初始化信号集
sigemptyset(&sigset);
// 添加要屏蔽的信号,例如SIGINT
sigaddset(&sigset, SIGINT);
// 设置信号屏蔽字
if (sigprocmask(SIG_SETMASK, &sigset, NULL) < 0) {
perror("sigprocmask error");
return 1;
}
// 处理SIGINT信号
struct sigaction sa;
sa.sa_handler = &handle_sig;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
// 等待SIGINT信号
printf("Waiting for SIGINT...\n");
pause();
// 查看是否有保存的信号
if (sigpending(NULL, &sigset) < 0) {
perror("sigpending error");
return 1;
}
if (sigismember(&sigset, SIGINT)) {
printf("SIGINT is pending\n");
} else {
printf("SIGINT is not pending\n");
}
return 0;
}
在这个例子中,程序设置了SIGINT信号的屏蔽字,然后注册了一个信号处理函数。当用户按下Ctrl+C
发送SIGINT信号时,信号被保存,直到调用sigprocmask
解除屏蔽。在解除屏蔽之前,通过sigpending
检查是否有保存的信号,并在信号处理函数中处理这个信号。
评论已关闭