#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
void printSignalset(sigset_t s)
{
int i = 0;
for (i = 0; i < 32; i++)
{
// sigismember 从 集合 s 中读取 第 i 位的值 (0/1)
if (1 == sigismember(&s, i))
{
putchar('1');
}
else
{
putchar('0');
}
}
puts("");
}
int main()
{
//sigset_t ***是一个64位的数*** , 类似于这样 0000000000000000000000000000000000000000000000000000....
// ***这里面每一个位置都对应着一个信号(信号是有 ID 的 kill -l 查看信号 ID), 其位置上面的值就是这个信号的状态***
sigset_t s, p;
int i = 0;
// sigemptyset 这个函数设置Linux ***用户自定义的 block 集合 *** (sigset_t s) 将其内容清空(置 0)
sigemptyset(&s); //(sigset_t s) 将其内容清空(置 0)
sigaddset(&s, SIGQUIT);// 将 集合 s 中的 SIGQUIT 信号位置置 1
sigaddset(&s, SIGINT);// 同上, 将 SIGINT 信号所属的位置置 1
sigprocmask(SIG_BLOCK, &s, NULL);// 将 sigset_t s 集合以 ***或的形式*** 注册进 ***内核中的 block 集合*** ,
while (1)
{
sigpending(&p); // 读取内核中的 pending 集合
printSignalset(p);// 打印出现在 pending 中的信号状态, 1 为未决态, 0 表示信号已经发送
if (10 == i)
{
sigemptyset(&s); // 将 s 集合的内容再次清空
sigaddset(&s, SIGINT); // 将 SIGINT 信号所属的位置置 1
sigprocmask(SIG_UNBLOCK, &s, NULL);// SIG_UNBLOCK 就是将 s 集合 取反再与 的形式注入 内核的block 就是置 SIGINT 成 0
// 比如 : 先 1 取反变 0, 0 与 原先的 1 这样的话原先的 1 就变成了 0
}
sleep(1);
printf("循环第 %d 次\n", i + 1);
i++;
}
return 0;
}
linux消息机制学习笔记
最新推荐文章于 2021-05-15 06:09:24 发布