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. SQL Server 调优系列基础篇 - 并行运算总结(二)

    前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...

  2. python中read()、readline()、readlnes()

    在python中 1.file.read()直接按原样读取文件,它通常用于将文件内容放到一个字符串变量中,如果文件大于可用内存,则不可能实现这种处理,因为原来文件里面是str_class,所以 fil ...

  3. ORA-01034:Oracle not available

    ORA-01034:Oracle not available 问题描述:ora-01034常与ora-27101同时出现,都是在登录数据库的时候报该错误 错误原因:出现ORA-01034和ORA-27 ...

  4. SOD范例

    SOD申请台站波形数据范例: <?xml version="1.0"?> <sod> <eventArm> <fdsnEvent> ...

  5. ora-01830:日期格式图片在转换整个输入字符串之前结束

    在to_date的时候因为 fldsj这个字段的大小 与 ‘yyyy-MM-dd’不符合 所以需要截取下fldsj字段的大小  to_char(to_date(substr(fldsj,1,10),' ...

  6. jquery ajax 语法

    $("select[name=type_id]").change(function(e) {    var val=$(this).val();    $.ajax({       ...

  7. WiFi Pineapple的Karma攻击与原理探究

    WiFi钓鱼是一种被炒烂了的安全威胁,你几乎每天都能从电视.网络媒体中看到因误连了恶意WiFi导致大笔资金失窃的案例,并且很多媒体语不惊人死不休的报道风格总是能把当事人的受害过程删减修饰到灵异的程度. ...

  8. RSA签名验证无法通过,检查以下部分

    RSA签名验证无法通过,检查以下部分:1.是否和上游交换公钥,提交给上游的公钥是否配置正确并生效2.检查加密方式是SHA1还是MD5,是否跟上游一致3.上游采用的是否是base64SafeUrl的方式 ...

  9. parseConf(配置文件解析器)

    /****************************************************************************** * * parseConf(配置文件解析 ...

  10. PR使用技巧

    1.要经常使用快捷键,这样能进步效率. 常用的快捷键是:+(放大),-(缩小),v(移动),c(切刀),x(变速),L(快放),ctrl+K(载切),ctrl+M(输出视频),ctrl+alt+M(输 ...