sigprocmask 阻塞进程

本系列文章由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7334771




1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。

 

2、信号阻塞和忽略信号的区别。

阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。

 

3、信号阻塞系统调用,它们的都起到阻塞的作用,它们不是协作使用的。

[cpp] view plaincopyprint?
  1. #include <signal.h>  
  2.   
  3. int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);  
  4.   
  5. int sigsuspend(const sigset_t*sigmask);  


sigprocmask设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。


参数:

how:用于指定信号修改的方式,可能选择有三种

SIG_BLOCK//将set所指向的信号集中包含的信号加到当前的信号掩码中。即信号掩码和set信号集进行或操作。

SIG_UNBLOCK//将set所指向的信号集中包含的信号从当前的信号掩码中删除。即信号掩码和set进行与操作。

SIG_SETMASK //将set的值设定为新的进程信号掩码。即set对信号掩码进行了赋值操作。

 

set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。

oldset:也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号。

返回说明:

成功执行时,返回0。失败返回-1,errno被设为EINVAL。

 


sigprocmask示例(演示添加信号掩码):

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <signal.h>  
  3. void checkset();  
  4.   
  5. void main()  
  6. {  
  7.      sigset_tblockset;  
  8.      sigemptyset(&blockset);  
  9.      sigaddset(&blockset,SIGINT);  
  10.      sigaddset(&blockset,SIGTSTP);  
  11.   
  12.      checkset();  
  13.   
  14.      sigprocmask(SIG_SETMASK,&blockset,NULL);  
  15.      checkset();  
  16.   
  17.      sigaddset(&blockset,SIGTERM);  
  18.      sigprocmask(SIG_BLOCK,&blockset,NULL);  
  19.      checkset();  
  20.   
  21.      sigdelset(&blockset,SIGTERM);  
  22.      sigprocmask(SIG_UNBLOCK,&blockset,NULL);  
  23.      checkset();  
  24. }  
  25.   
  26. void checkset()  
  27. {  
  28.   
  29.      sigset_tset set;  
  30.      printf("checksetstart:\n");  
  31.   
  32.      if(sigprocmask(0,NULL,&set)<0)  
  33.      {  
  34.      printf("checksetsigprocmask error!!\n");  
  35.      exit(0);  
  36.      }  
  37.   
  38.      if(sigismember(&set,SIGINT))  
  39.      printf("sigint\n");  
  40.      if(sigismember(&set,SIGTSTP))  
  41.      printf("sigtstp\n");  
  42.   
  43.      if(sigismember(&set,SIGTERM))  
  44.      printf("sigterm\n");  
  45.       printf("checksetend\n");  
  46. }  



sigprocmask示例(演示添某部分代码不被信号打搅):

 

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <signal.h>  
  3. void checkset();  
  4.   
  5. void func();  
  6. void main()  
  7. {  
  8.      sigset_tblockset,oldblockset,pendmask;  
  9.      printf("pid:%ld\n",(long)getpid());  
  10.   
  11.      signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行  
  12.   
  13.     sigemptyset(&blockset); //初始化信号量集  
  14.     sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中  
  15.     sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中  
  16.   
  17.    sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字  
  18.   
  19.      /*执行以下程序时,不会被信号打搅*/  
  20.     checkset();  
  21.     sleep(5);  
  22.      sigpending(&pendmask); //检查信号是悬而未决的  
  23.      if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理  
  24.          printf("SIGINTpending\n");  
  25.   
  26.      /*免打搅结束*/  
  27.   
  28.      sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP  
  29.      printf("SIGINTunblocked\n");  
  30.      sleep(6);  
  31. }  
  32.   
  33. void checkset()  
  34. {  
  35.      sigset_tset;  
  36.      printf("checksetstart:\n");  
  37.      if(sigprocmask(0,NULL,&set)<0)  
  38.      {  
  39.      printf("checksetsigprocmask error!!\n");  
  40.      exit(0);  
  41.      }  
  42.      if(sigismember(&set,SIGINT))  
  43.      printf("sigint\n");  
  44.   
  45.      if(sigismember(&set,SIGTSTP))  
  46.      printf("sigtstp\n");  
  47.   
  48.      if(sigismember(&set,SIGTERM))  
  49.      printf("sigterm\n");  
  50.   
  51.      printf("checksetend\n");  
  52.   
  53. }  
  54. void func()  
  55. {  
  56.      printf("hellofunc\n");  
  57. }  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中奇妙的replace

1、发现问题&#xff1a; 今天在读require.js源代码时&#xff0c;不经意读到这么一段代码&#xff1a; 1 //If no name, and callback is a function, then figure out if it a2 //CommonJS thing with dependencies.3 if (!deps && isFunction(callback)) {4 dep…

移除首页-重回首页

之前发布了一篇文章《订餐系统之获取淘宝外卖订单》&#xff0c;因为是关于淘宝外卖的&#xff0c;所以文中出现这个词时&#xff0c;都加了链接&#xff0c;还设置了 target_blank,就是为了让看的人方便点击&#xff0c;查看。后来&#xff0c;博客园说这个文章中含有推广链接…

Scrum之 回顾会议

Scrum中Sprint计划会议是最重要的事件&#xff0c;第二重要的事件就是回顾会议&#xff0c;因为这是团队做改进的最佳时机。如果没有回顾&#xff0c;就会发现团队在重犯相同的错误。在sprint的评审会议后&#xff0c;团队需要进行一次回顾会议&#xff0c;以下我将把会议主要内…

java的未检查异常有哪些_Java:检查异常与未检查异常

一、异常的介绍Throwable 是 Java 中所有错误和异常的超类。Java 虚拟机仅抛出属于此类(或其子类之一)的实例对象&#xff0c;或者是 throw 语句也可以抛出该对象。同样&#xff0c;catch 子句中的参数类型也只能是此类(或其子类之一)。处于编译时检查异常为目的&#xff0c;Th…

java array_Java 数组

Java 数组数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。Java语言中提供的数组是用来存储固定大小的同类型元素。你可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff…

idea 执行 java jar_idea打包java可执行jar包的实现步骤

1,在项目上鼠标右键 --> Open Module Settings2, Artifacts --> --> JAR --> From modules with dependencies...3, Main Class是你这个项目(脚本)的主方法,就是要运行的类,选一个4,如下图,设置 META-INF/MANIFEST.MF!!!!!切记,不能用默认的(起码我用默认的是不成…

约法三章

与自己约法三章如下&#xff1a; 1. 禁止发表悲观的言论&#xff0c;你是阳光的。哪怕翅羽沉重&#xff0c;依旧头颅高昂。 2. 专注&#xff0c;专注才能让你更有魅力。最近老不能集中注意力。 3. 做好自己。不管怎么样&#xff0c;你都有人在你背后关怀你支持着你&a…

raspberry pi 家族

项目 A型 B型 B型 2代B型 SoC(系统级芯片) Broadcom BCM2835&#xff08;CPU&#xff0c;GPU DSP和SDRAM&#xff09; Broadcom BCM2836 CPU ARM1176JZF-S核心(ARM11系列)700MHz 单核 ARM Cortex-A7 900MHz 4核 GPU(图形处理器) Broadcom VideoCore IV, OpenGL ES 2.0, 1080p 3…

tomcat java php_为什么要用tomcat?

首先&#xff0c;tomcat是开源的&#xff0c;基于java语言开发的&#xff0c;部署web项目的容器。普通的html&#xff0c;浏览器可以直接搞定&#xff0c;可以不需要tomcat等部署&#xff0c;但是如servlet这些&#xff0c;浏览器没法直接将里面的内容解析出来吧。这些就需要一…

安装配置树莓派的最佳工具——NOOBS

本文由 极客范 - 开了光的喜羊羊 翻译自 Jason Fitzpatrick。欢迎加入极客翻译小组&#xff0c;同我们一道翻译与分享。转载请参见文章末尾处的要求。如果你想找一种最简单的方式启动你的树莓派&#xff0c;不用再左顾右盼啦&#xff01;树莓派基金会开发的 New Out Of Box Sof…

玩转树莓派Raspberry Pi 篇一:入门篇

前言&#xff1a;之前发了一篇树莓派刷OpenWrt系统的晒单&#xff0c;得到众多网友的关注&#xff0c;小编要希望分享更多DIY树莓派的经验。我玩树莓派都是比较简单的DIY&#xff0c;也积累了一点经验&#xff0c;在此分享给大家&#xff0c;算是抛砖引玉&#xff0c;希望看到大…

服务器三大类

SMP、NUMA、MPP体系结构介绍从系统架构来看&#xff0c;目前的商用服务器大体可以分为三类&#xff0c;即对称多处理器结构 (SMP &#xff1a; Symmetric Multi-Processor) &#xff0c;非一致存储访问结构 (NUMA &#xff1a; Non-Uniform Memory Access) &#xff0c;以及海量…

C语言 文件

1. 需要了解的概念 需要理解的知识点包括&#xff1a;数据流、缓冲区、文件类型、文件存取方式 1.1 数据流&#xff1a; 指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时&#xff0c;都会先进行“打开文件”操作&#xff0c;这个操作就是在打开数据流&#xff0…

calcite连接mysql_使用Calcite做Sql语法解析

Flink SQL中使用Calcite作为sql语法解析、校验、优化工具&#xff0c;本篇是实操篇&#xff0c;介绍一下calcite做sql语法解析使用方式。sql经过calcite解析之后&#xff0c;得到一棵抽象语法树&#xff0c;也就是我们说的AST&#xff0c;这棵语法树是由不同的节点组成&#xf…

两个结构体ifconf和ifreq

用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq&#xff0c;它们对于大多数人 来说都是比较陌生的&#xff0c;这里给大家一种比较简单的理解方法&#xff0c;当然只一种帮助 理解的方法&#xff0c;在描述中可能会有一些地方与真实定义有所出入&#xff0c;仅供参考. …

简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序

Socket简要阐述Socket的概念Socket的英文原义是“孔”或“插座”。在网络编程中&#xff0c;网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个Socket。Socket套接字是通信的基石&#xff0c;是支持TCP/IP协议的网络通信的基本操作单元…

华为基于策略划分VLAN的配置方法及示例

学过思科交换机的朋友&#xff0c;可能对基于策略划分VLAN的配置方法印象非常深&#xff0c;感觉确实比较复杂&#xff0c;先要配置VMPS以及VMPS数据库&#xff0c;但在华为交换机中&#xff0c;这种现象得到了彻底改变&#xff0c;因为它有了一种特殊的端口类型——Hybrid。说…

我的世界java刷怪数量_Minecraft我的世界Java版18w16a更新发布

Minecraft我的世界Java版18w16a更新发布&#xff01;Minecraft 1.13 仍未发布&#xff0c;18w16a为其第32个预览版。目前新版本已经基本完成了所有特性&#xff0c;现在更专注于漏洞修复和细节打磨了&#xff01;MINECRAFT SNAPSHOT 18W16AA Minecraft Java Edition snapshotJa…

IOS web app一些实用的属性设置

IOS对safari私有的属性很多&#xff0c;虽然很多不为人知但是却很实用。掌握好这些属性对web app和混合app的开发会很有帮助。 1.format-detection[telephoneno] 是否自动把电话号码转为链接 1<meta name"format-detection" content"telephoneno">IO…

小米功能机支持java吗_小米竟然卖功能机了!2.8吋/15天超长待机

【手机中国 新闻】众多周知&#xff0c;小米是从智能手机起家的&#xff0c;对于功能机从未涉足。但自从有了强大的小米生态链&#xff0c;制造各种科技产品那都不是事儿了。8月2日上午10点&#xff0c;小米有品众筹频道上线了一款功能手机——QIN多亲AI电话&#xff0c;仅售19…