信号集/信号屏蔽字
1、信号集
类型:sigset_t
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
2、信号屏蔽字
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
3、信号处理函数
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
信号屏蔽示例:block.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void int_handler(int n) //中断信号处理函数
{
write(1,"!",1);
}
int main()
{
int i,j;
sigset_t newset,oldset,tmpset;
signal(SIGINT,int_handler); //注册中断信号处理函数
sigemptyset(&newset); //将新建的信号集清空
sigaddset(&newset,SIGINT); //添加中断信号
sigprocmask(SIG_UNBLOCK,&newset,&oldset); //解除信号屏蔽并保存信号屏蔽字状态
sigprocmask(SIG_BLOCK,&newset,&tmpset); //屏蔽信号并保存旧的屏蔽字状态
for(j=0;j<100;j++)
{
for(i=0;i<5;i++)
{
write(1,"*",1);
sleep(1);
}
write(1,"\n",1);
// sigsuspend(&tmpset); //下面三句话的原子操作
/*****************************************************************/
sigprocmask(SIG_SETMASK,&tmpset,NULL); //设置屏蔽字取消中断屏蔽
pause(); //等待信号到来
sigprocmask(SIG_SETMASK,&newset,NULL); //设置屏蔽字屏蔽中断信号
/*****************************************************************/
}
sigprocmask(SIG_SETMASK,&oldset,NULL); //退出程序前恢复进入时的屏蔽字
exit(0);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现