/* sigsuspend()函数说明 */

#include <stdio.h>
#include <signal.h> /*
知识补充:
sigsuspend()函数 函数原型:
#include <signal.h>
int sigsuspend(const sigset_t *mask); 参数说明:
@mask 希望屏蔽的信号 返回值:
sigsuspend返回后将恢复调用之前的的信号掩码。信号处理函数完成后,进程将继续执行。该系统调用始终返回-1,并将errno设置为EINTR. 备注:
进程执行到sigsuspend时,sigsuspend并不会立刻返回,进程处于TASK_INTERRUPTIBLE状态并立刻放弃CPU,
等待UNBLOCK(mask之外的)信号的唤醒。进程在接收到UNBLOCK(mask之外)信号后,调用处理函数,然后还原信号集,
sigsuspend返回,进程恢复执行。 使用场景:
sigsuspend() 函数可以更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞。
使用这种技术可以保护不希望由信号中断的代码临界区。
如果希望对一个信号解除阻塞,然后pause等待以前被阻塞的信号发生,那么必须使用 sigsuspend() 函数
pause() 函数无法达成上述目的 //a.阻塞信号
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
err_sys("SIG_BLOCK error"); //b.解除阻塞
if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
err_sys("SIG_SETMASK error"); //c.等待信号
pause(); 说明: 如果在等待信号阶段,发送信号给程序,那么 pause()函数退出,处理信号
如果在解除阻塞之前发送信号,信号一被解除,立马执行信号处理函数,执行完毕后,回来执行 pause()函数,程序被卡住 为了纠正此问题,需要在一个原子操作中先恢复信号屏蔽字,然后使进程休眠。这种功能是由 sigsuspend() 函数提供的。 */ void test()
{
sigset_t set; //1.设置需要处理的信号
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGINT); //2.先屏蔽这些信号
if (sigprocmask(SIG_BLOCK, &set, NULL) == -)
{
printf("sigprocmask() failed .\n");
return;
} //3.做一些初始化操作 //4.开始接收这些信号
sigemptyset(&set); //清空信号集 sigsuspend(&set); //等待信号过来处理 } int main()
{
test();
printf("-----ok-------\n");
return ;
}

最新文章

  1. 构建自己的PHP框架--实现Model类(1)
  2. BZOJ 2431 &amp; DP
  3. 在XP上安装WinPython最新版本
  4. PowerDesigner(六)-物理数据模型(PDM逆向工程)(转)
  5. 利用PowerDesigner绘制PDM生成SQL Server数据库
  6. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍
  7. SGU 199 Beautiful People(DP+二分)
  8. C# 注销掉事件,解决多播委托链表的问题
  9. Lintcode--008(编辑距离)
  10. CF 444B(DZY Loves FFT-时间复杂度)
  11. MySQL新增用户以及数据库访问授权
  12. 通过Hack方式实现SDC中Stage配置联动刷新
  13. 报错:ERROR ParcelUpdateService:com.cloudera.parcel.components.ParcelDownloaderImpl: Unable to retrieve remote parcel repository manifest
  14. 一文读懂高性能网络编程中的I/O模型
  15. postman(五):在不同接口之间传递数据
  16. ds18b20采集温度并上报服务器
  17. es的mapping设置
  18. SQL注入之Sqli-labs系列第十八关(基于错误的用户代理,头部POST注入)
  19. 【383】defaultdict 相关用法
  20. .Net 导出Excel时设置单元格的格式为文本类型

热门文章

  1. angular8中 如何引入两个echarts版本
  2. 【TCP】TCP三次握手与四次挥手
  3. Centos7 增量备份数据脚本
  4. 性能测试基础---事务&amp;检查点&amp;思考时间&amp;集合点
  5. web api .net C# mvc API返回XML文档的解析并取值
  6. jmeter压测学习2-linux运行jmeter环境
  7. destoon系统开发-最新利用浏览器的cookie 做历史浏览记录
  8. Ofbiz项目学习——阶段性小结——更新数据
  9. BlocksKit block从配角到主角—oc通往函数式编程之路--oc rx化?
  10. SpringBoot 过滤器, 拦截器, 监听器 对比及使用场景