信号导致的问题

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

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

#include

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

#include

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

#include

#include

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);

}

说明:程序检查到屏蔽信号中有SIGINT信号在排队,就调用sigsuspend函数切换屏蔽信号,程序处理SIGINT信号后,sigsuspend函数才返回。

Linux信号-信号集&amp&semi;信号屏蔽字&amp&semi;捕捉信号【转】

转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念    实际执行信号的处理 ...

三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数

34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...

信号屏蔽的切换的理解sigsuspend

#include #include #include #include

Linux C 程序 信号及信号的处理&lpar;19&rpar;

信号及信号的处理 1.Linux信号的介绍  信号是一种软件中断.Linux系统中根据POSIX标准扩展的信号机制.  1.信号来源      1.硬件方式           1.当用户按下某个键, ...

Linux系统编程之----》信号

"===信号========================================================================================= ...

Linux系统编程——进程间通信:信号中断处理

什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能:  ping一个网段内的IP,检测哪 ...

&lbrack;Linux&rsqb;返回被阻塞的信号集

一.概述 在另一篇实例说到,进程可以屏蔽它不想接收的信号集. 事实上这些被屏蔽的信号只是阻塞在内核的进程表中,因为他们不能递送给进程,所以状态是未决的(pending). 利用sigpending函数 ...

linux 进程学习笔记-进程信号sigal

信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...

随机推荐

javascript基础07

javascript基础07 1.节点 元素.childNodes : 属性 只读 属性 子节点列表集合 元素.childNodes 只包含子节点,不包含孙节点 DOM节点的类型有很多种,w3c标准有 ...

php--yii2框架错误提示

if($code!=200){ $user=new UserAuth(); $user->mobile=$register['mobile']; $user->password=md5($ ...

JavaWeb 文件上传 commons&lowbar;fileupload方式

import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadExcept ...

WCF - 地址

WCF顾名思义 即解决在windows平台下与各种平台中的程序之间通信的问题 而终结点则是WCF通信的唯一手段 终结点承载了所有通信的功能 一个WCF服务是通过对应的终结点发布出来的 发布出来的数据称 ...

SQL中 WHERE与HAVING的区别

SQL语句中的Having子句与where子句之区别 在说区别之前,得先介绍GROUP BY这个子句,而在说GROUP子句前,又得先说说“聚合函数”——SQL语言中一种特殊的函数.例如SUM, COU ...

Echarts关系图-力引导布局

需要做一个树形图,可以查看各个人员的关系. 可伸缩的力引导图-失败 刚开始,打算做一个可展开和伸缩的,搜索时候发现CSDN有一篇美美哒程序媛写的Echarts Force力导向图实现节点可折叠. 这里 ...

Android 圆角的效果实现

Android 自定义ImageView实现圆角图片昨天给学生布置作业,写微信首页,也就是聊天的界面,listView里的item中联系人的头像是圆角的,图形界面如下: 那么我就仔细研究了圆角的具体实 ...

&lbrack;LeetCode&rsqb; Maximum Swap 最大置换

Given a non-negative integer, you could swap two digits at most once to get the maximum valued numbe ...

Android Studio 1&period;2&period;2设置显示行号

Android Studio设置显示行号的方法与Eclipse有少许差别,直接在代码中右键,弹出右键菜单是没有显示行号功能的. 在Android Studio中设置方法有二: 1.临时显示行号 在单个 ...

服务器与本地的控制工具unison

中文文档:https://wiki.archlinux.org/index.php/Unison_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 下载:http://un ...

linux c 禁止对外通信,Linux c 屏蔽信号、切换信号相关推荐

  1. linux c 禁止对外通信,Linux C套接字:在recv调用时被阻止

    在我的应用程序中,我为简单的http服务器创建了一个线程,然后从我的应用程序中尝试连接到http服务器,但是在recv调用中控件被阻止/挂起. 但是,如果尝试使用linux GET命令连接到应用程序的 ...

  2. linux系统禁止邮箱服务,Linux禁止smtp发送邮件,禁止25端口,防止垃圾邮件

    有时候,一些网站不小心被黑,导致垃圾邮件泛滥而遭到投诉,这是我们不想遇到的.怎么样在Linux禁止smtp发送邮件,禁止25端口,防止垃圾邮件?我们可以用iptables来实现屏蔽25端口,如果服务器 ...

  3. linux怎样禁止他人远程,linux禁止用户远程登录的方法

    linux禁止用户远程登录的方法: 1.在新添加一个新用户的时候就指定这个用户不能远程登录 useradd  -s /sbin/nologin zgsj        //这里就是创建了一个不能远程登 ...

  4. linux程序间管道通信,linux进程间通信——管道 详解

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入.常说的管道多是指无名管道, 无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有名管道叫nam ...

  5. linux 同一进程内通信,linux中,管道能够在同一进程中进行通信吗?

    linux中,管道能够在同一进程中进行通信吗? 答案是否定的. 管道是用于不同进程之间通信,不能再同一进程中进行通信. 同一进程中,直接进行参数传递就行了,不设计通信问题. 不同进程之间才需要通信,通 ...

  6. linux如何禁止pci设备,Linux 内核PCI去除一个设备

    一个 PCI 可用多个不同的方法被从系统中去除. 所有的 card-bus 设备在一个不同的物 理因素上是真正的 PCI 设备, 并且内核 PCI 核心不区分它们. 允许在机器运行时加减 PCI 设备 ...

  7. linux 怎么禁止遍历目录,linux下遍历目录功能实现

    /* 编译: dir:dir.c gcc -o $@ $< */ #include #include #include #include #include int do_search_dir(c ...

  8. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  9. linux 设置禁止ping,linux设置禁止ping

    linux禁止ping 为了服务器的安全, 防止网络攻击(DOS 攻击消耗网络宽带,CPU资源), 需要服务器设置 禁止ping 通常有两种方式 第一种是通过防火墙 iptables 设置 第二种是内 ...

最新文章

  1. IntelliJ IDEA 2019.3这回真的要飞起来了,新特性抢先看!
  2. TCP握手--(HTTP权威指南学习笔记)
  3. MFC中的CString.Format及CString,string,char*之间的转换
  4. Entity Framework教程
  5. 如何让智能客服成为企业的生产力工具?
  6. 表格数字乘以百分比怎么算_EXCEL记住这两个快捷键,1秒种设好数字格式
  7. pycharm error:no module named caffe
  8. mybatis mysql merge into_整合DRUID数据源+MyBatis
  9. 跑步与读书都废掉了...工作目前也在换新的.
  10. Twitter数据抓取
  11. Cloud Foundry 2018欧盟峰会日程已确定
  12. 金算盘加密狗维护信息
  13. 【FFmpeg命令】jpg与yuv(批量)互转
  14. C#初学者教程系列3:Hello World:第一个控制台应用程序
  15. 在线供应链管理系统一体化解决方案,整合B2B上下游供应资源
  16. 0.5mm间距BGA芯片的PCB设计
  17. 接口与继承系列教材 (十)- Java 内部类详解
  18. 摄像头网页服务器,网络摄像头实现直播的方法 在网页浏览器播放等于可以在网页传播...
  19. Ambire钱包白皮书
  20. 一文掌握Tableau制作透视表/数据表

热门文章

  1. logstash实例简单demo
  2. 百度大脑的燎原之势:强大成标配,更深得企业拥抱AI之心
  3. 向量点乘相关公式推导及 几何解释
  4. 如何估算普通LED灯珠的额定电压和功率
  5. Java中类型zhaun‘huan
  6. 413:Calling Extraterrestrial Intelligence Again(翻译 )
  7. 2018-2019 ACM-ICPC沈阳(C,J)
  8. JAVA基础知识-集合
  9. 怎么给证件照换背景?教你一招快速更换证件照背景色
  10. SHA 和 RSA 的区别