Linux编程基础 4.3:信号阻塞

4 信号阻塞

在进程PCB中存在两个信号集:信号掩码(signal mask)、未决信号集(signal pending)。
两个信号集都是位图,每一位对应一个信号:

  • 若mask中某个位被设置为1,则对应的信号将被屏蔽;
  • 此时内核会修改pending中该信号对应的位为1,使该信号处于未决态;
  • 除非该信号被解除屏蔽,否则内核不会再向进程发送这个信号;
  • 用户不能直接操作未决信号集,但可以自定义的set位图与mask进行位操作,以达到屏蔽或解除屏蔽的目的。

4.1 信号集设定函数

#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);

函数功能:设定自定义信号集:

  • sigemptyset:将指定信号集清0;
  • sigfillset:将指定信号集置1;
  • sigaddset:将某个信号加入指定信号集;
  • sigdelset:将某个信号从信号集中删除;
  • sigismember:判断某个信号是否已加入指定信号集。

参数说明

  • set:一个sigset_t类型的指针,sigset_t是系统自定义类型,其实质是一个位图,一般用户不会对位进行直接操作的,通过上述函数进行间接操作。

返回值说明

  • 成功返回0
  • 不成功返回-1

4.2 sigprocmask函数

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

函数功能:自定义位图设定完成后,要与mask位图进行位操作,以改变mask位图中的数据。

参数说明

  • how:用于设置位操作的方式,取值如下:
    – SIG_BLOCK:set位图中需要屏蔽的信号,即mask = mask | set;
    – SIG_UNBLOCK:set位图中需要解除屏蔽的信号,即mask = mask & ~set;
    – SIG_SETMASK:set位图用于替代mask的新屏蔽集,即mask = set。
  • set和oldset:指向位图的指针,set指向用户自定义位图,oldset记录原mask位图的值。

返回值说明

  • 成功返回0;
  • 不成功返回-1,并设置errno。

特别说明
系统中什么时候产生什么信号是有规律的,用户进程不应随便对mask进行修改。因此在用户进程中的功能实现之后,应尽量使用sigprocmask的传出参数oldset恢复mask。

4.3 sigpending函数

#include <signal.h>
int sigpending(sigset_t *set);

函数功能:获取当前进程中未决信号集的信息。

参数说明

  • set:一个传出参数,获取未决信号集信息。

返回值说明

  • 1:成功
  • -1:不成功

【案例 1】以2号信号为例,通过位操作函数sigprocmask和sigpending获取信号状态。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>void printset(sigset_t *paraPed){int i;for(i = 1; i < 32; i ++){if(sigismember(paraPed, i) == 1){putchar('1');}else{putchar('0');}//of ifprintf("\n");}//of for i
}//of printsetint main(){sigset_t tempSet, tempOldSet, tempPed;sigemptyset(&tempSet);          //初始化sigaddset(&tempSet, SIGINT);    //将2号信号SIGINT加入tempSetsigprocmask(SIG_BLOCK, &tempSet, &tempOldSet); //位操作while(1){sigpending(&tempPed);printset(&tempPed);sleep(1);}//of whilereturn 0;
}//of main

执行程序,终端会不断打印进程PCB中的未决信号集。初始情况下进程未决信号集中的每一位都应为0,因此打印的信息如下:

00000000000000000000000000000000

使用kill命令或组合按键Ctrl+C驱使内核发送信号SIGINT给当前进程。进程第一次接收到信号SIGINT后,sigprocmask被触发,此后终端打印的信息如下:

01000000000000000000000000000000

之后继续向进程发送SIGINT信号,终端打印信息不变,说明信号SIGINT被成功屏蔽。

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

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

相关文章

# 定义四边形_【四边形系列专题】 特殊平行四边形之矩形

点击上方蓝字关注我们【四边形系列专题】特殊平行四边形之矩形TSQ中学数学微信&#xff1a;TSQmaths一、知识网络二、重难突破知识点一 矩形的性质及应用1、定义&#xff1a;有一个角是直角的平行四边形叫做矩形&#xff0e;注意&#xff1a;1、对称性&#xff1a;矩形是轴对称…

xs资料网-产品设计图档下载_proe玩具车3D模型图档下载creo4.0汽车模型下载中磊教育...

现在设计产品的还是有相当一大部分人是用proe造型的&#xff0c;之前我们一直做的是UG的产品造型&#xff0c;今天给大家介绍一款玩具车的3d模型&#xff0c;喜欢的可以下载下载自己研究研究&#xff0c;中磊教育产品设计教程proe玩具车3D模型图档是通过曲面造型所绘制的零件&a…

Linux编程基础 4.4:信号捕获

5 信号捕获 信号的产生是异步事件&#xff0c;进程不知道信号何时会递送&#xff0c;也不会等待信号到来。 进程可以为信号注册信号处理函数来实现自定义动作。 进程的信号在内核态处理&#xff0c;内核为每个进程准备了一个信号向量表&#xff0c;记录每个信号所对应的处理机…

苹果7手机严重卡顿_分享苹果手机最实用的7个技巧,各个精心挑选,不知道真的太亏了...

使用苹果手机这么久了&#xff0c;你一定也发现了不少好用的功能&#xff0c;今天就来分享苹果手机最实用的7个技巧&#xff0c;每个都是精心挑选&#xff0c;不要错过&#xff0c;总有一个是你需要的。1、 三指操作在编辑文档的时候&#xff0c;三指左滑是撤销(上一步编辑撤销…

实验一:系统编程开发环境实验

一【实验目的】 1.熟悉Linux开发环境&#xff1b; 2.掌握Linux程序编译调试方法&#xff1b; 3.理解文件I/O通用操作&#xff0c;掌握内核函数的基本用法&#xff1b; 4.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a;…

如何获取大端中的数据_【软件】ProE中各种获取数据方式的区别

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;软件ProE中各种获取数据方式的区别输入特征&#xff1a;输入特征是通过数据共享功能从外部文件输入几何的&#xff0c;文件输入以后&#xff0c;会转换成proe软件能够识别的几何&#xff0c;称为一个特征发布几何&#…

实验二:文件操作编程实验

一【实验目的】 1.掌握文件或目录属性信息的函数stat()函数的使用&#xff1b; 2.掌握目录操作的函数opendir 函数和readdir函数的使用&#xff1b; 3.编写程序mysearch.c递归实现打印输出任意目录下&#xff0c;指定类型的所有文件&#xff0c;如&#xff1a;./mysearch /hom…

数字类 default 0和 default 0_全方位的数字规划工具Visual Components 4.0 数字化工厂仿真软件...

Visual Components 是全方位的数字规划工具。无论从制程规划、生产到营销都能够整合在同一个平台上作业&#xff0c;有助于内部的技术沟通及外部营销。此外&#xff0c;Visual Components 整合了物流及机器人模拟功能&#xff0c;帮助企业在研发前期即可进行产能确认&#xff0…

python中写入csv文件的方法_Python写入CSV文件的方法

python笔记5-python2写csv文件中文乱码问题前言python2最大的坑在于中文编码问题&#xff0c;遇到中文报错首先加u&#xff0c;再各种encode、decode。当list、tuple、dict里面有中文时&#xff0c;打印出来的是Unicode编码&#xff0c;这个是无解的。对中文编码纠结的建议尽快…

实验三:进程管理编程实验

一【实验目的】 1.熟悉进程环境、进程生命周期&#xff1b; 2.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写的程序源码&#xff0c;务必添加关键语句的注释&#xff1b; 2…

会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...

在现实生活中你是否遇到过这样的情况&#xff0c;笔记本近在咫尺&#xff0c;但你却懒得走到笔记本面前进行操作。当你疲惫地躺在床上时&#xff0c;心里也总是暗想&#xff0c;如果笔记本能够听我的指令跟我对话就好了。工作和生活当中&#xff0c;我们总免不了想要“偷懒”&a…

expect巡检服务器_Shell-批量巡检服务器脚本

文件说明该Shell脚本旨在针对大量Linux服务器的巡检提供一种相对自动化的解决方案。脚本组成有三部分&#xff1a;shellsh.sh、checksh.sh、file.txt&#xff1b;这三个文件需放在一个文件夹下以root权限执行&#xff0c;缺一不可。脚本用法将要巡检的服务器的IP地址和对应的密…

实验四:进程间通信编程实验

一【实验目的】 1.理解进程间通信原理&#xff1b; 2.掌握进程中信号量、共享内存、消息队列相关的函数的使用&#xff1b; 3.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写…

细粒度图像分类_1.1、 图片分类

记录图像分类论文资源列表。图片分类任务可以分为&#xff1a;粗粒度图片分类、细粒度图片分类。2012 AlexNet &#xff1a;ImageNet Classification with Deep Convolutional Neural Networks。2014 GoogLeNet&#xff1a;Going Deeper with Convolutions。Rethinking the Inc…

diy服务器个人主机_Re:从零开始的服务器-微型服务器DIY手记

国际象棋测试4-Chess Benchmark.png (25.64 KB, 下载次数: 63)2017-3-22 19:43 上传RAR benchmarkWinRAR自带的基准测试7-RARbench.png (15.8 KB, 下载次数: 54)2017-3-22 19:45 上传7-zip benchmark7zip自带的基准测试8-7zipbench.png (31.2 KB, 下载次数: 70)2017-3-22 19:45…

实验五:线程编程实验

一【实验目的】 1.理解线程环境、线程的生命周期&#xff0c; 2.理解线程同步&#xff0c;掌握内核函数的基本用法。 3.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写的程序…

where里能用max吗_超市里四五元钱的速冻饺子能买吗?

展开全部我家里都特别喜欢吃带馅的食物&#xff0c;尤其是我儿子只要是饺子和馄饨&#xff0c;吃起来准没够。62616964757a686964616fe59b9ee7ad9431333433653938包饺子虽然不是什么力气活&#xff0c;但是有时候做起来也感觉太过繁琐&#xff0c;尤其是孩子要吃的时候&#xf…

python的迭代_迭代法 python

详解迭代器的使用 | 手把手教你入门Python之八十上一篇&#xff1a;自定义异常 | 手把手教你入门Python之七十九下一篇&#xff1a;生成器 | 手把手教你入门Python之八十一本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》&#xff0c;主讲人姜…

实验六:套接字编程实验

一【实验目的】 1.掌握面向连接的套接字编程框架&#xff1b; 2.掌握面向无连接的套接字编程框架; 3.掌握I/O复用、套接字选项设置&#xff1b; 4.掌握非阻塞式I/O。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写的程序源码&am…

idea代码回滚_IDEA远程仓库版本回滚

使用 git 进行项目的版本控制时&#xff0c;肯定会遇到回滚版本的情况&#xff0c;回滚有两种&#xff0c;一种是本地仓库回滚&#xff0c;另外一种是远程仓库回滚。以下详细讲解两种回滚方式&#xff0c;本文主要讲解远程回滚&#xff0c;以及常见使用误区。本地仓库回滚本地回…