sigprocmask系统调用

使用条件:

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

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

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

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

功能描述:

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

用法:

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

参数:

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

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

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

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

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

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

返回说明:

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

 #include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h> static void sig_int(int signo)
{
int i;
printf("caught SIGQUIT\n");
for(i=;i<=;i++)
{
printf("signal handle %d\n",i);
sleep();
}
signal(SIGQUIT, SIG_DFL);//将SIGQUIT的动作设为缺省值
}
int main()
{
sigset_t newmask;
sigset_t oldmask;
sigset_t pendmask;
int i=; //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针sig_int处执行
signal(SIGINT, sig_int); //初始化信号量集
sigemptyset(&newmask); //将SIGQUIT添加到信号量集中
sigaddset(&newmask, SIGQUIT); //将newmask中的SIGQUIT阻塞掉,并保存当前信号屏蔽字到Oldmask
sigprocmask(SIG_BLOCK, &newmask, &oldmask);
printf("sigprocmask SIGQUIT finish\n");
//休眠5秒钟,这里做说明:在5s休眠期间,任何SIGQUIT信号都会被阻塞,如果在5s内收到任何键盘的quit信号
//则此时会把这些信息存在内核的队列中,等待5s结束后,可能要处理此信号。
for(i=;i<=;i++)
{
sleep(1);
printf("block %d\n",i);
} //检查哪些信号是悬而未决的
sigpending(&pendmask); //检查SIGQUIT是否悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
if (sigismember(&pendmask, SIGQUIT))
{
printf("\nSIGQUIT pending\n");
} //恢复被屏蔽的信号SIGQUIT
sigprocmask(SIG_SETMASK, &oldmask, NULL); /**开始处理信号,调用信号处理函数*/
printf("SIGQUIT unblocked\n"); sleep();//再次休眠5秒钟 return (); }

所谓阻塞时间为:“sigprocmask(SIG_BLOCK, &newmask, &oldmask)”设置阻塞到“sigprocmask(SIG_SETMASK, &oldmask, NULL)”解除阻塞的整个时间,当然这期间发生了信号处理函数,也将阻塞信号集中的信号。

以上示例是Linux redhat,
执行结果是
$./a.out

sigprocmask SIGQUIT finish       //信号集添加了“SIGQUIT ”信号
block 0
^Ccaught SIGQUIT         //发生了信号处理函数
signal handle 0
signal handle 1
^\signal handle 2          //信号处理函数过程中信号集中的信号仍然阻塞
signal handle 3
signal handle 4
signal handle 5
block 1
^\block 2              //信号集中的信号阻塞
block 3
block 4
block 5

SIGQUIT pending
退出 (核心已转储)

【sigpending系统调用】

#include<signal.h>

int sigpending(sigset_t *set);

sigpending函数返回信号集,其中的各个信号对于调用进程是堵塞的而不能递送,因而也一定是未决的。该信号集通过set参数返回。

linux 信号处理 三 (信号集的使用)的更多相关文章

  1. Linux系统编程—信号集操作函数

    先来回顾一下未决信号集是怎么回事. 信号从产生到抵达目的地,叫作信号递达.而信号从产生到递达的中间状态,叫作信号的未决状态.产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集, ...

  2. Linux进程间通信(三) - 信号

    什么是信号 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程间通 ...

  3. linux 信号处理 二 (信号的默认处理)

    今天碰到一个SIGHUP问题,再复习一遍: 有些信号的默认处理方式为“终止+core”,这里的core表示,进程终止时,会在进程的当前工作目录生产一个core文件,该文件是进程终止时的内存快照,以便以 ...

  4. Linux信号-信号集&信号屏蔽字&捕捉信号【转】

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

  5. linux 下信号处理命令trap && linux下各种信号的意义

    1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...

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

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

  7. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  8. [Linux]返回被阻塞的信号集

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

  9. 三、Linux部署MinIO分布式集群

    MinIO的官方网站非常详细,以下只是本人学习过程的整理 一.MinIO的基本概念 二.Windows安装与简单使用MinIO 三.Linux部署MinIO分布式集群 四.C#简单操作MinIO 一. ...

随机推荐

  1. PHP:第四章——数组中的排序函数

    <pre> <?php header("Content-Type:text/html;charset=utf-8"); //1) /*sort - 对数组进行升序 ...

  2. Openwrt WiFi Configure(1)

    1      Scope of Document This document describes how to custom wifi option 2      Requiremen 2.1     ...

  3. C# 格式化表

    C#格式化数值结果表 字符 说明 示例 输出 C 货币 string.Format("{0:C3}", 2) $2.000 D 十进制 string.Format("{0 ...

  4. python3 scrapy 爬取腾讯招聘

    安装scrapy不再赘述, 在控制台中输入scrapy startproject tencent 创建爬虫项目名字为 tencent 接着cd tencent 用pycharm打开tencent项目 ...

  5. zabbix的搭建与入门

    一,Zabbix架构 zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.zabbix 能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制 ...

  6. spring aop 的理解

    spring aop的相关概念(所有的概念都是为了生成代理类这个过程所需要的信息的抽象): 1.Targer:目标对象.被代理的对象. 2.Advice:增强/通知.就是为目标对象扩展的功能.分为前置 ...

  7. (转)Secondary NameNode的作用

    在Hadoop中,有一些命名不好的模块,Secondary NameNode是其中之一.从它的名字上看,它给人的感觉就像是NameNode的备份.但它实际上却不是.很多Hadoop的初学者都很疑惑,S ...

  8. anu - event

    import { document } from "./browser"; import { isFn, noop, options } from "./util&quo ...

  9. grafana查询中的变量templating

    有时我们在管理成百上千台机器的时候,配置grafana无疑是明智的,因为你不需要一个一个的把每个机器的图形都配置一遍,利用templating就可以瞬间实现n台机器的状态显示了. templating ...

  10. jQuery自动完成点击html元素

    /************************************************************************** * jQuery自动完成点击html元素 * 声 ...