sigsuspend解决时序竞态问题

  • 使用pause()函数, 会导致在恢复信号集之前程序挂起
#include <unistd.h>
#include <signal.h>
#include <stdio.h> void handler(int sig)    //信号处理函数的实现
{printf("SIGINT sig\n");
}int main(void)
{sigset_t new,old;struct sigaction act;act.sa_handler = handler;  //信号处理函数handlersigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGINT, &act, 0);  //准备捕捉SIGINT信号(注册)sigemptyset(&new);sigaddset(&new, SIGINT);sigprocmask(SIG_BLOCK, &new, &old);  //将SIGINT信号阻塞,同时保存当前信号集printf("Blocked\n");    //模拟阻塞了SIGINTpause(); // 因为之前阻塞了SIGINT, 所以SIGINT在挂起期间永远不会递达, 程序将永久挂起sigprocmask(SIG_SETMASK, &old, NULL);  //恢复原阻塞信号集printf("sigprocmask recovered\n");return 0;}
  • 使用sigsuspend()函数在程序挂起期间临时撤销对wait信号集中的SIGUSR1以外的信号阻塞(只临时阻塞SIGUSR1), 在挂起期间, 程序可以对除SIGUSR1以外的信号(如SIGINT)进行处理, 执行sigaction
  • sigsuspend实际是将临时阻塞SIGUSR1和pause结合起来原子操作
  • 临时替换信号集wait和挂起是一个原子操作
#include <unistd.h>
#include <signal.h>
#include <stdio.h> void handler(int sig)    //信号处理函数的实现
{printf("SIGINT sig\n");
}int main(void)
{sigset_t new,old, wait;struct sigaction act;act.sa_handler = handler;  //信号处理函数handlersigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGINT, &act, 0);  //准备捕捉SIGINT信号sigemptyset(&new);sigaddset(&new, SIGINT);//sigprocmask作用: 改变当前进程的阻塞信号集sigprocmask(SIG_BLOCK, &new, &old);  //将SIGINT信号阻塞(模拟Ctrl+c失效),同时保存当前信号集printf("Blocked\n");    // 模拟阻塞SIGINT(Ctrl+c), 模拟失去cpusigemptyset(&wait);sigaddset(&wait, SIGUSR1);//pause(); 是挂起期间对所有信号都响应// 在程序挂起期间对wait(SIGUSR1)临时不响应, 而响应其他所有信号,如SIGINT, 挂起结束后恢复. // 程序挂起期间可以不想被SIGUSR1打断// 挂起期间可以用SIGINT(Ctrl+c)唤醒进程sigsuspend(&wait);  sigprocmask(SIG_SETMASK, &old, NULL);  //恢复原阻塞信号集printf("sigprocmask recovered\n");return 0;}

sigsuspend()函数解决时序竞态问题相关推荐

  1. Linux信号实现精确到微秒的sleep函数:通过sigsuspend函数解决时序竞态问题

    原理就是先使用定时器定时,然后再使用pause函数或者sigsuspend函数主动阻塞挂起,最终恢复现场. 如果使用pause函数的话,优点是使用简单,缺点是有可能产生时序竞态,导致进程一直阻塞下去: ...

  2. Linux系统编程----8(竞态条件,时序竞态,pause函数,如何解决时序竞态)

    竞态条件(时序竞态): pause 函数 调用该函数可以造成进程主动挂起,等待信号唤醒.调用该系统调用的进程将处于阻塞状态(主动放弃 cpu) 直 到有信号递达将其唤醒,等不到一直等 int paus ...

  3. Linux系统时间和时序,什么是时序竞态 Linux系统时序竞态问题分析

    什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的.但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态.时序竞态前导例 在讲时序 ...

  4. linux多线程时序问题,Linux时序竞态问题(sleep函数的实现)

    时序竞态是指同样的程序,多次调用运行的结果不同,这是由于争夺系统资源所造成的.比如说我们要使用alarm和pause函数来实现一个sleep的功能,那么由于alarm函数的实现过程并不是一个原子操作, ...

  5. Linux信号、进程间关系pause, 时序竞态,sigsuspend

    1. pause函数 --> wait for signal 该函数可以造成进程主动挂起,等待信号唤醒.调用该系统调用的进程将处于阻塞状态(主动放弃CPU)直到有信号递达将其唤醒. int pa ...

  6. linux操作系统之竞态条件(时序竞态)

    (1)时序竞态:前后两次运行同一个程序,出现的结果不同. (2)pause函数:使用该函数会造成进程主动挂起,并等待信号唤醒,调用该系统调用的进程会处于阻塞状态(主动放弃CPU) 函数原型:int p ...

  7. Linux系统编程(五)时序竞态

    时序竞态 产生原因 改进 总结 产生原因 #include <cstdio> #include <stdio.h> #include <sys/time.h> #i ...

  8. 时序竞态(竞态条件)

    产生原因:仍然以前文实现的sleep函数为例,如果进程在执行完alarm函数后,突然失去CPU,被阻塞等待(这是有可能的,进程在执行过程中,若非原子操作,都有可能随时失去CPU),如果失去CPU的时间 ...

  9. linux的基础知识——时序竞态

    文章目录 1.pause函数 1.1 pause函数例子 2.时序问题 3.解决时序问题 4.例子:sigsuspend函数的举例 5.总结 1.pause函数 1.1 pause函数例子 \qqua ...

最新文章

  1. hexo-github-博客搭建指南
  2. 解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题
  3. Linux之SELinux的基本应用
  4. 卸载后的mysql和navicat怎么清除干净_小而巧的卸载工具
  5. 空间数据挖掘的主要方法总结
  6. 二次规划的一个很好的课件网站
  7. JEECG Framework 3.4.3 GA 版本发布
  8. mysql 快速初始化_MySQL中的批量初始化数据的对比测试(r12笔记第71天)
  9. 数据挖掘-朴素贝叶斯分类
  10. 吴恩达《机器学习》第六章:逻辑回归
  11. 信息发布系统 Jquery+MVC架构开发(6)BLL层提供WCF 服务 .
  12. 将下图的nfa确定化为dfa_实战技术利用AutoCAD确定PCB板型
  13. 数据结构面试经典问题汇总
  14. python extension c++ 扩展
  15. picpick尺子像素大小精度不够准确_谈谈“精度”与“分辨率”,很多人容易混淆的问题。...
  16. oracle minus intersect,minus,oracle中INTERSECTMINUS用法
  17. ESP8266 AP模式建立服务器
  18. 抢购茅台,618只能用这种方法
  19. 一位过来人:也谈谈体制内 • 体制外
  20. linux目录和链接的区别,Linux 下软链接和硬链接的区别

热门文章

  1. 怎样调整计算机亮度,怎样调整计算机亮度_电脑怎么调整亮度
  2. 如何在Ubuntu 20.04 Focal Fossa Linux上设置FTP服务器
  3. 9款最好的基于Rails的CMS内容管理系统
  4. el-table 表格 业务标配模板;
  5. 成功解决Linux安装vim不成功(package ‘vim‘ has no installation candidate)
  6. 基于Vue3.0+Springboot在线购物商城网站设计
  7. geth共识替换方法
  8. Java 基础常见知识点面试题总结(上),2022 最新版!
  9. 红蓝对抗-最全信息收集工具
  10. Kmeans算法原理