[Linux]返回被阻塞的信号集
一、概述
在另一篇实例说到,进程可以屏蔽它不想接收的信号集。
事实上这些被屏蔽的信号只是阻塞在内核的进程表中,因为他们不能递送给进程,所以状态是未决的(pending)。
利用sigpending函数可以返回这些未决信号集。
int sigpending(sigset_t *set);
二、示例
1.示例中进程屏蔽了SIGUSR1信号,当给进程发送该信号后,它就会被sigpending函数返回,可以尝试先向进程发送SIGUSR2,然后再发送SIGUSR1,再而发送SIGUSR2,观察信号处理函数的变化。
#include <stdio.h>
#include <unistd.h>
#include <signal.h> void sig_usr(int signo)
{
sigset_t s_2;
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
printf("received signal %d\n", signo);
sigpending(&s_2);
if(sigismember(&s_2, SIGUSR1))
printf("SIGUSR1 pending\n");
} int main(void){
sigset_t s_1;
sigemptyset(&s_1);
sigaddset(&s_1, SIGUSR1);
sigprocmask(SIG_SETMASK, &s_1, NULL); signal(SIGUSR1, sig_usr);
signal(SIGUSR2, sig_usr); for (;;)
{
pause();
}
return ;
}
2.现在来修改一下示例1,把信号处理函数改为,当检测到有SIGUSR1被阻塞时,马上释放它(再次调用屏蔽字函数,把信号集设为空集)
#include <stdio.h>
#include <unistd.h>
#include <signal.h> void sig_usr(int signo)
{
sigset_t s_2, s_3;
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
printf("received signal %d\n", signo);
sigpending(&s_2);
if(sigismember(&s_2, SIGUSR1)){
printf("SIGUSR1 pending, now release it\n");
sigemptyset(&s_3);
sigprocmask(SIG_SETMASK, &s_3, NULL);
}
} int main(void){
sigset_t s_1;
sigemptyset(&s_1);
sigaddset(&s_1, SIGUSR1);
sigprocmask(SIG_SETMASK, &s_1, NULL); signal(SIGUSR1, sig_usr);
signal(SIGUSR2, sig_usr); for (;;)
{
pause();
}
return ;
}
测试时,先发送两次SIGUSR1信号,然后发送一次SIGUSR2信号,输出结果是:
received SIGUSR2
SIGUSR1 pending, now release it
received SIGUSR1
可见:
1.信号被释放后进程马上接收到了该信号。
2.尽管已向进程发送了多次SIGUSR1,但是最后的释放,进程只收到一次SIGUSR1信号,这是因为有些信号是不被列队的,如果阻塞该信号,那么尽管发送了多次,最后释放时也只会收到一次,请参考《Unix高级环境编程》第10.13章。
[Linux]返回被阻塞的信号集的更多相关文章
- linux系统编程之信号(五):信号集操作函数,信号阻塞与未决
一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...
- Linux 信号详解五(信号阻塞,信号未决)
信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- 《UNIX环境高级编程》笔记--信号集
1.信号集基本操作 我们需要有一个能表示多个信号--信号集(signal set)的数据类型.POSIX.1定义了数据类型sigset_t以包含一个信号 集,并且定义了一下五个处理信号处理信号集函数. ...
- Linux系统编程——进程间通信:信号中断处理
什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- linux 信号处理 三 (信号集的使用)
sigprocmask系统调用 使用条件: 1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2. ...
- Linux系统编程—信号集操作函数
先来回顾一下未决信号集是怎么回事. 信号从产生到抵达目的地,叫作信号递达.而信号从产生到递达的中间状态,叫作信号的未决状态.产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集, ...
- Linux Linux程序练习十三(信号阻塞,捕获)
/* * 题目: * 请编写一个程序,设置SIGINT和SIGQUIT信号, * 并在该程序中实现从文件中读取信息的操作, * 并保证在读取文件且只有在读取文件的过程中不会被发送的SIGINT和SIG ...
随机推荐
- Jeecg-Boot前后端分离版
Jeecg-Boot前后端分离版http://www.jeecg.org/forum.php?gid=229 Jeecg-Boot 快速开发平台http://boot.jeecg.org/user/l ...
- php 计算两点地理坐标的距离
<?php /** * 计算两点地理坐标之间的距离 * @param Decimal $longitude1 起点经度 * @param Decimal $latitude1 起点纬度 * @p ...
- SpringCloud---网关概念、Zuul项目搭建(六)
SpringCloud---网关概念.Zuul项目搭建(六) 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...
- 队列(FIFO)—循环队列、队列的链式存储
1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表 ...
- 001 java简介
JavaSE(Java Standard Edition):标准版本,定位在个人计算机上的应用.(失败) JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用. ...
- windows环境下mysql密码重置
1.打开cmd窗口,输入命令[mysqld --skip-grant-tables]回车. 2.再打开一个cmd窗口,输入命令[mysql]回车. 3.输入命令[use mysql; ] 连接权限数据 ...
- Azure DevOps
Azure DevOps https://azure.microsoft.com/zh-cn/services/devops/ It looks great!
- IFE第一天
我也不知道自己到底能坚持多少天,希望66天可以坚持下来,flag在此. 第一天的知识大概就是了解一些基本概念. Web: 基于HTTP协议,利用浏览器访问网站. HTML 大概就是告诉浏览器我有一个什 ...
- noip2017部分题目
D1T3 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经过 ...
- python的数据类型及运用
int: 主要方法:a.bit.length()———将a转化为二进制的最小位数: bool: false/True str——>bool: s='空'——>false s=“非空”——& ...