当前位置: 首页 > news >正文

进程信号——信号的保存

信号的概念

实际执行信号的处理动作称为信号递达(Delivery)
信号从产生到递达之间的状态,称为信号未决(Pending)。
进程可以选择阻塞 (Block )某个信号。
被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

所以我在这我们会介绍三张表,他们就是task_struct里面的三张表。

根据上面所说的概念,这里可以总结一下,什么时候才能触发信号要执行的函数呢?
以2号信号来举例子,block里2号位为0,pending位图为1,且handler里的执行方法部位sig_ign,这时候才会触发对应的函数,这里演示一段代码

这个函数可以用来,重新注册我们的block位图,如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则 更改进程的信 号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后 根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值。

how的选项


其实我们一般都是用的sig_setmask这个参数,毕竟这个学习成本最低了。

操作系统给我提供了一个类型sigset_t就是用来搞block位图的。他是配合着sigemptyset,sigaddset函数使用的

int sigemptyset(sigset_t *set);

sigemptyset函数用于初始化一个信号集,将信号集中的所有信号都清空,其中,set为指向信号集的指针。函数成功执行时,返回0;否则,返回-1。

int sigaddset(sigset_t *set, int signum);

sigaddset函数用于将指定的信号添加到信号集中,其中,set为指向信号集的指针,signum为待添加的信号编号。函数成功执行时,返回0;否则,返回-1。

int sigpending(sigset_t *set);

sigpending函数用于获取当前进程未决的信号集,即已经产生但还未被处理的信号集,其中,set为指向信号集的指针。函数成功执行时,返回0;否则,返回-1。其实就是用来手机pending表。

void signaled(int i)
{cout << "666" << endl;sleep(1);
}void PrintPendingmap(sigset_t& ped)
{cout << "进程id:" << getpid() << " Pendinglist:";for (int i = 31; i > 0; i--){if (sigismember(&ped, i)){cout << 1;}else{cout << 0;}}cout << endl;
}int main()
{//注册信号signal(2,signaled);//給两个表一个,一个用来设置,一个用来保存久的表sigset_t block, oblock;//将两个表置空sigemptyset(&block);sigemptyset(&oblock);//设置要阻塞的信号sigaddset(&block, 2);//设置新表,保存旧表sigprocmask(SIG_SETMASK, &block, &oblock);int cnt=10;while (1){cnt--;// 当cnt等于0时删除阻塞,就是就将旧表重新设置,不保存旧表if(cnt==0)sigprocmask(SIG_SETMASK, &oblock, nullptr);//获取pending表并打印对应的位图sigset_t m;sigpending(&m);PrintPendingmap(m);sleep(1);}return 0;
}

运行程序

我们将2号信号阻塞过后,我们ctrl+c就会使进程接收信号,但此时2号为阻塞,当十秒过后阻塞结束,就会执行信号的函数,然后pending表xin'da


http://www.mrgr.cn/news/66520.html

相关文章:

  • keepalived mysql8互为主从, 要注意哪些问题
  • lanqiaoOJ 3255:重新排队 ← STL list 单链表
  • 知识蒸馏概念(Knowledge Distillation)的学习
  • 【JavaScript】JavaScript开篇基础(4)
  • 无人机干扰与抗干扰,无人机与反制设备的矛与盾
  • 实时金融股票数据API接口websocket接入方法
  • 聚划算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测
  • 0.推荐序
  • 3.5 windows xp ReactOS EiAllocatePool()
  • [代码随想录打卡Day7] 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • GCC编译器的`-Wall`、`-Wextra`和`-pedantic`选项解读
  • Vue3-子传父
  • ORA-00020和ORA-00603报错处理
  • 【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)
  • B2118 验证子串
  • Swift 开发教程系列 - 第5章:集合类型
  • oracle数据检查方法
  • 多client向同一个pushgateway推送指标被覆盖问题
  • 解密抖音推荐算法:个性化内容背后的技术奥秘
  • 【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
  • 一篇文章速通Java开发Stream流(流水线开发附斗地主小游戏综合案例)
  • 一文快速预览经典深度学习模型(一)——CNN、RNN、LSTM、Transformer、ViT
  • Vue:计算属性
  • JavaScript 变量作用域与函数调用机制:var 示例详解
  • SEO
  • 一个最简单的网络编程