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,一经查实,立即删除!

相关文章

python ftp 设置代理_用Python搭建一个简单的代理池

def get_user_agent():随机获取一个用户代理user_agents["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET …

C++变量命名规则

浅谈C变量命名规则 不知道别的公司如何&#xff0c;反正我现在的公司对变量命名并没有一定的规范&#xff0c;唯一要求就是能简单易懂&#xff0c;但是&#xff0c;我想&#xff0c;这个多个程序员&#xff0c;大概每个人都有自己习惯的一套 命名规则吧&#xff0c;不过&#…

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…

python3 x和python2 x区别_Python知识:Python 3.x和2.x版本的使用区别

使用Python时都需要安装相应的版本&#xff0c;不同的版本适用性也不一样。今天从除法算子、打印功能、Unicode、Xrange、错误处理、未来模块方面看看Python2.x和Python3.x之间的区别。除法算子在移植代码或在python2.x中执行python3.x代码时&#xff0c;要注意整数除法的更改&…

select EINTR

实验环境&#xff1a;ubuntuKylin 13.10 在程序里同时有select和定时器&#xff0c; select 会被定时器产生的EINTR中断 在定时器的设置中增加了SA_RESTART和sigprocmask&#xff0c;发现都不管用 只能自己判断EINTR来重启select了。 在select被EINTR中断时&#xff0c;我输…

移除首页-重回首页

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

sap客户信贷_信贷控制,FD32的销售值不会变化,只有应收总额的变化

请去检查 行项目类型的设定.里面有个栏位 Credit active , 我基本可以确定这里没有勾上才会出现你的问题.ID: Item with active credit function / relevant for creditSpecifies whether the credit management functions (credit checks and update statistics) for order, d…

Scrum之 Sprint计划会议

在sprint第一天召开sprint计划会议&#xff0c;这个会议分为两部分&#xff0c;计划会议1由PO、SM和Team参加&#xff0c;主要是从产品backlog中挑选出需要放到当前sprint下的既定产品backlog&#xff0c;然后由SM、Team参加计划会议2&#xff0c;把既定产品backlog的故事拆分成…

树莓派dht11 python_树莓派使用DHT11温湿度传感器

使用wiringpi编写C程序&#xff1a;如下程序借鉴了网上一老外的程序&#xff0c;忘了原帖地址在哪。#include #include #include #include #define MAX_TIME 85#define DHT11PIN 7#define ATTEMPTS 5 //retry 5 times when no responseint dht11_val[5]{0,0,0,…

java 输出流_Java中输入输出流方法总结

4.如果你创建了一个文件对象,你可以使用下面的方法来获得文件的相关信息,对文件进行操作。1)文件名的操作public String getName()&#xff1b;返回文件对象名字符串&#xff0c;串空时返回nullpublic String toString()&#xff1b;返回文件名字符串public String getParent()…

Windows 8操作技巧之快捷键大全

Windows 8操作系统发布之后&#xff0c;因为其新颖的界面和对触屏友好的设计&#xff0c;使许多长期使用Windows系统的用户&#xff0c;也觉得一时难以适应&#xff0c;一些操作方式也不知道如何去实现。在Windows系统中&#xff0c;快捷键无疑是提高操作速度的杀手锏。然而&am…

Scrum之 站立例会

在sprint期间&#xff0c;每天都会通过站立例会来进行沟通&#xff0c;以下我将把会议主要内容罗列一下。&#xff08;以下会议内容来自于Scrum Checklists) 会议内容 目标 团队成员间工作进度的沟通和协调 会议准备 邀请与会者&#xff1a;团队所有成员、Scrum Master、产品负…

Java中带标签的break,continue

首先不带标签的break,continue 就不介绍了。大家平时用的最多的也就是这样的情况了。 首先Java中没有goto&#xff0c;但是可以利用带标签的break, continue来实现类似的跳转。 首先来看一个例子&#xff1a; label:for (int i 0; i < 10; i) {for (int j 0; j < 10; j…

Scrum之 回顾会议

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

java删除换行符号_如何从Java中删除文件中的换行符?

如其他答案所述&#xff0c;您的代码主要String.replace(...)不起作用&#xff0c;因为不会更改目标字符串。(它不能 - Java字符串是不可变的&#xff01;)它实际上做的是创建一个新的String&#xff0c;其中的字符根据需要进行了更改。但是你的代码然后扔掉那个String ...这是…

C#学习之按钮点击事件

描述&#xff1a;asp.net中服务器控件Button的点击事件OnClientClick和OnClick的区别&#xff1f; 解答&#xff1a;http://www.cnblogs.com/ypfnet/archive/2012/12/24/2830771.html&#xff08;作者&#xff1a;代号小子&#xff09; 一、 二者的区别&#xff1a; OnClick是…

Scrum之 评审会议

在sprint周期最后&#xff0c;需要进行一次评审会议&#xff0c;让团队向产品负责人和利益相关者展示已完成的功能。sprint审核的大部分实践用于团队成员展示功能、回答利益相关者对展示的疑问并记录所期望的更改。评审会议可以吸引相关利益者的关注&#xff0c;让其他人了解团…

Bringing up interface eth0: Device eth0 does not seem to be presen

故障现象&#xff1a;51Testing软件测试网.M|{,lbr 51Testing软件测试网l]9H/f[w)h service network restart51Testing软件测试网l^i2t?|5zT8J-s Shutting down loopback insterface: [ OK ]51Testing软…

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

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

warning:deprecated conversion from string constant to 'char *'解决方案

Linux 环境下当GCC版本比较高时&#xff0c;编译代码可能出现的问题 问题是这样产生的&#xff0c;先看这个函数原型&#xff1a; void someFunc(char *someStr); 再看这个函数调用&#xff1a; someFunc("Im a string!"); 把这两个东西组合起来&#xff0c;用最新的…