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

信号导致的问题

信号导致的问题

不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号?

 

1.      信号屏蔽

    intsigprocmask(int how,//操作方式

                                                               SIG_BLOCK屏蔽信号

                                                               SIG_UNBLOCK剪除屏蔽信号

                                                               SIG_SETMASK修改屏蔽信号

                                   constsigset_t *sigs,//操作的信号集合

                                   sigset_t*oldsigs);//返回原来操作的信号集合

返回值:执行成功返回0,失败返回-1。

屏蔽信号的步骤:

1.      声明信号集

        sigset_t sigs;

2.      加入屏蔽信号

        一组信号集合维护函数

        2.1. 清空集合sigemptyset

               int sigemptyset( sigset_t *set);

            2.2. 添加信号到集合sigaddset

                int sigaddset( sigset_t *set ,int  signum);

            2.3. 从集合删除信号sigdelset

                int sigdelset(sigset_t *set,int signum);

            2.4. 添加所有信号到集合sigfillset

                 int sigfillset( sigset_t*set);

2.5.  判定信号是否在集合sigismember

         int sigismember(const sigset_t *set ,int signum);

3.      屏蔽信号

4.      接触屏蔽

 

例子:

 

#include<stdio.h>

#include<signal.h>

 

 

void main()

{

int sum=0;

//声明信号集

sigset_t sigs;

//清空信号集

sigemptyset(&sigs);

//添加信号到信号集

sigaddset(&sigs,SIGINT); //

//屏蔽信号

sigprocmask( SIG_BLOCK,&sigs,0);

for(i=1;i<=10;i++)

{

     sum+=i;

     sleep(1);

}

printf(“sum=%d\n”,sum);

//捡出屏蔽

sigprocmask(SIG_UNBLOCK,&sigs,0);//捡出屏蔽,信号立即触犯,打印over不能//执行,如果没有捡出屏蔽信号,over正常打印

printf(“OVER!\n”);

}

 

说明:当屏蔽了某个信号,这个信号将不会触发,直到我们捡出了该信号,信号才会触发。

 

2.查询被屏蔽的信号

                                 intsigpending(sigset_t *sets); 返回0成功,-1失败

例子:

 

#include<stdio.h>

#include<signal.h>

 

 

void main()

{

int sum=0;

//声明信号集

sigset_t sigs;

sigset_t sigp;

//清空信号集

sigemptyset(&sigs);

//添加信号到信号集

sigaddset(&sigs,SIGINT); //

//屏蔽信号

sigprocmask( SIG_BLOCK,&sigs,0);

for(i=1;i<=10;i++)

{

     sum+=i;

     sigpending(&sigp);//得到屏蔽的信号

     if(sigismemeber(&sigp,SIGINT))

     {

           printf(“信号SIGINT在排队\n”);

     }

     sleep(1);

}

printf(“sum=%d\n”,sum);

//捡出屏蔽

sigprocmask(SIG_UNBLOCK,&sigs,0);

printf(“OVER!\n”);

}

 

 

 

 

2.      信号屏蔽的切换

    int sigsuspend(sigset_t *sigs);

                                   屏蔽新的信号,原来的信号失效.

                                   sigsuspend是阻塞函数.对参数信号屏蔽.

                                   对参数没有指定的信号不屏蔽,但当没有屏蔽信号处理函数调用完毕

                                   sigsuspend返回条件:

                                                        1.信号发生,并且信号是非屏蔽信号

                                                        2.信号必须要处理,而且处理函数返回后,sigsuspend才返回.

                                  

                                   sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号

                                   而且当sigsuspend返回的时候,恢复旧的屏蔽信号.

 

函数sigsuspend将进程的信号屏蔽码设置为sigs,然后与pause()函数一样等待信号的发生并执行完信号处理函数。信号处理函数执行完后再把进程的信号屏蔽码设置为原来的屏蔽字,然后sigsuspend函数才返回。 Sigsuspend总是返回-1。 

 

例子:

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

 

void deal()

{

   printf(“处理信号SIGINT\n”);

}

 

void main()

{

        signal(SIGINT,deal);

 int sum=0;

//声明信号集

sigset_t sigs;

sigset_t sigp;

sigset_t newsig=NULL;

//清空信号集

sigemptyset(&sigs);

//添加信号到信号集

sigaddset(&sigs,SIGINT); //

//屏蔽信号

sigprocmask( SIG_BLOCK,&sigs,0);

for(i=1;i<=10;i++)

{

     sum+=i;

     sigpending(&sigp);//得到屏蔽的信号

    if(sigismemeber(&sigp,SIGINT))

     {

           printf(“信号SIGINT在排队\n”);

           sigsuspend(&newsig);//切换屏蔽信号,等待SIGINT信号,并调用处//理函数后函数返回。

     }

     sleep(1);

}

printf(“sum=%d\n”,sum);

}

 

转载于:https://www.cnblogs.com/seaney/p/3568793.html

相关文章:

  • Java 网页抓取 工具类
  • htmlUnil-2.33 jar包
  • WCF学习总结
  • javascript模拟鸟群使用cax和threejs渲染引擎
  • 18-07-31
  • Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题...
  • QM课程03-采购中的质量管理
  • win7 wamp 64位 php环境如何开启curl服务?
  • ZOJ3765 Lights Splay树
  • 4个实用的微服务测试策略
  • float,double和decimal类型
  • iOS:高仿闲鱼、京东等列表底部分页视图
  • 使用MDI 和 XtraTabbedMdiManager 后 选项卡切换后Ribbon 合并后不选中MDI子窗...
  • java~springboot~ibatis Invalid bound statement (not found)原因
  • c#正则表达式
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • bearychat的java client
  • co模块的前端实现
  • eclipse(luna)创建web工程
  • iOS | NSProxy
  • Java教程_软件开发基础
  • Js基础——数据类型之Null和Undefined
  • JS实现简单的MVC模式开发小游戏
  • js作用域和this的理解
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Redis在Web项目中的应用与实践
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • springboot_database项目介绍
  • STAR法则
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于遗传算法的优化问题求解
  • 简单基于spring的redis配置(单机和集群模式)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 思否第一天
  • 我的业余项目总结
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • "无招胜有招"nbsp;史上最全的互…
  • (1)(1.13) SiK无线电高级配置(六)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (接口自动化)Python3操作MySQL数据库
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十六)串口UART
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (未解决)macOS matplotlib 中文是方框
  • (小白学Java)Java简介和基本配置
  • (一)Linux+Windows下安装ffmpeg
  • (转) 深度模型优化性能 调参
  • (转)关于如何学好游戏3D引擎编程的一些经验