把所有常规信号的未决状态打印至屏幕
信号未决状态,说的实际是未决信号集。即我们要打印输出未决信号集到屏幕上。在此之前,先看看信号集操作函数
int sigemptyset(sigset_t *set); 将某个信号集清0 成功:0;失败:-1
int sigfillset(sigset_t *set); 将某个信号集置1 成功:0;失败:-1
int sigaddset(sigset_t *set, int signum); 将某个信号加入信号集 成功:0;失败:-1
int sigdelset(sigset_t *set, int signum); 将某个信号清出信号集 成功:0;失败:-1
int sigismember(const sigset_t *set, int signum);判断某个信号是否在信号集中 返回值:在集合中:1;不在集合中:0;出错:-1
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 成功:0;失败:-1,设置error 作用:用来屏蔽信号、解除屏蔽也使用该函数。严格注意,屏蔽信号:只是将信号处理延后执行(延至解除屏蔽);而忽略表示将信号丢处理。
参数:
set:传入参数,是一个位图,set中哪位置1,就表示当前进程屏蔽哪个信号。
oldset:传出参数,保存旧的信号屏蔽集。
how参数取值: 假设当前的信号屏蔽字为mask
SIG_BLOCK: 当how设置为此值,set表示需要屏蔽的信号。相当于 mask = mask|set
SIG_UNBLOCK: 当how设置为此,set表示需要解除屏蔽的信号。相当于 mask = mask & ~set
SIG_SETMASK: 当how设置为此,set表示用于替代原始屏蔽及的新屏蔽集。相当于 mask = set若,调用sigprocmask解除了对当前若干个信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。
int sigpending(sigset_t *set);读取当前进程的未决信号集;set是传出参数。 返回值:成功:0;失败:-1,设置error
上代码吧;
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void printset(sigset_t *ped)
{
int i;
for (i = 1; i < 32; i++) {
if ((sigismember(ped, i) == 1)) {
putchar('1');
}
else {
putchar('0');
}
}
printf("\n");
}
int main(void)
{
sigset_t set, ped;
sigemptyset(&set);
/*
Ctrl + c → 2) SIGINT(终止/中断) "INT" —-Interrupt
Ctrl + z → 20) SIGTSTP(暂停/停止) "T" —-Terminal 终端。
Ctrl + \ → 3) SIGQUIT(退出)
*/
sigaddset(&set, SIGINT);
sigaddset(&set, SIGTSTP);
sigaddset(&set, SIGQUIT);
sigaddset(&set, SIGKILL);//这是9号信号,是不能被屏蔽、捕捉的,写在这里是为了证实,还有19号信号也是。
sigfillset(&set);
sigprocmask(SIG_BLOCK, &set, NULL); //不获取原屏蔽字(阻塞信号集)
while (1) {
sigpending(&ped); //获取未决信号集
printset(&ped);
sleep(1);
}
return 0;
}
结果:因为ctrl+c不能结束程序,我们在另一个终端中用kill杀死进程:
,结果:
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?