博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 信号屏蔽
阅读量:6850 次
发布时间:2019-06-26

本文共 2051 字,大约阅读时间需要 6 分钟。

#include 
#include
#include
#include
#include
#include
/*sigemptyset(&newmask);//获取空屏蔽信号集sigfillset(&newmask);//获取屏蔽了全部信号的屏蔽信号集。除了那两个SIGKILL SIGSTOPsigpending(&pendmask);//获取进程中当前的屏蔽信号集sigaddset(&newmask, SIGQUIT);//往空屏蔽信号集增加SIGQUIT(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//并集(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//设置会原来的屏蔽信号集(sigismember(&fillmask, SIGQUIT))//推断SIGQUIT是否在当前的屏蔽信号集中*/static void sig_quit(int);intmain(void){ sigset_t newmask, oldmask, pendmask,fillmask; if (signal(SIGQUIT, sig_quit) == SIG_ERR)//设置信号处理函数 perror("can't catch SIGQUIT"); /* * Block SIGQUIT and save current signal mask. */ sigemptyset(&newmask);//获取空屏蔽信号集 sigaddset(&newmask, SIGQUIT);//往空屏蔽信号集增加SIGQUIT if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//并集 perror("SIG_BLOCK error"); sleep(5); /* SIGQUIT here will remain pending */ //睡眠期间按下多次 ctrl+\ 未决信号集中之保留一次 if (sigpending(&pendmask) < 0)//获取进程中当前的屏蔽信号集 perror("sigpending error"); if (sigismember(&pendmask, SIGQUIT))//推断SIGQUIT是否在当前的屏蔽信号集中 printf("\nSIGQUIT pending\n"); /* * Restore signal mask which unblocks SIGQUIT. */ if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//设置会原来的屏蔽信号集。因为SIGQUIT保留着一个未决信号,所以这里触发了信号处理函数,SIGQUIT变回默认处理 perror("SIG_SETMASK error"); printf("SIGQUIT unblocked\n"); sleep(5); /* SIGQUIT here will terminate with core file */ //在此期间按下 ctrl+\ 运行信号处理函数 ,调用默认处理。game over! printf("fillmask test\n"); if (sigfillset(&fillmask) < 0)//获取屏蔽了全部信号的屏蔽信号集,除了那两个SIGKILL SIGSTOP perror("sigfillset error\n"); if (sigismember(&fillmask, SIGQUIT))//推断SIGQUIT是否在当前的屏蔽信号集中 printf("\nSIGQUIT pending\n");//在 if (sigprocmask(SIG_SETMASK,&fillmask , &oldmask) < 0)//设置屏蔽全部 perror("fillmask error\n"); sleep(5); if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//假设在fillmask測试期间有按下ctrl+\。则以下不会睡眠5秒了。运行了SIGQUIT的默认处理函数 perror("SIG_SETMASK error\n"); sleep(5); exit(0);}static voidsig_quit(int signo){ printf("caught SIGQUIT\n"); //if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) // perror("can't reset SIGQUIT");}

转载地址:http://jsrul.baihongyu.com/

你可能感兴趣的文章
一次滚动一屏的滚动条行为实现
查看>>
.NET面试题(三)
查看>>
自定义TreeList单元格 z
查看>>
【百度地图】- 学习.1
查看>>
JS函数重载解决方案
查看>>
Nginx中的rewrite指令
查看>>
CSS系列:CSS3新增选择器
查看>>
IDDD 实现领域驱动设计-一个简单的 CQRS 示例
查看>>
IOS开发基础知识--碎片16
查看>>
Java的HashSet类
查看>>
Putty设置删除
查看>>
圈真的决定你的未来?
查看>>
各种分布式文件系统简介
查看>>
40 - 找出数组中仅仅出现一次的数字
查看>>
python spark 求解最大 最小 平均 中位数
查看>>
Stream API
查看>>
Turning off “Language Service Disabled” error message in VS2017
查看>>
C#根据句柄改变窗体控件值
查看>>
Beam编程系列之Python SDK Quickstart(官网的推荐步骤)
查看>>
Dropping TSO features since no CSUM feature
查看>>