信号——block+pending+handler表

信号

在这里插入图片描述
注意 :这由三张表,block只能添加修改pending只能获取 , handler只能修改

基础知识

  • 抵达——> 执行 / 忽略
  • sigset_t 信号集
  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作

信号集操作

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

使用这个函数改变某个特定的信号对应的处理方法—— handler 表中的方法

#include<stdlib.h>
void abort(void);

发送特定的信号6) SIGABRT——终止进程


#include<signal.h>
int raise(int sig);

向当前进程发送指定信号


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

注意:对sigset_t 生成的变量操作,只是将信号存储在栈上,并没有加进今进程pdb中


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

注意 : 使用这个函数将加入pcb中 ,使用这个函数只能对block表进行修改

how
SIG_BLOCK——添加
SIG_UNBLOCK——删除
SIG_SETMASK——设置
set 设置进pcb中,将pcb中原有的状态寄存如 oset


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

想要信号存入pending表中,可以先将这个信号阻塞,因为对于阻塞的信号,暂存在pending表中,直到阻塞解除
获取进程中所有 pending 信号

#include <iostream>
#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<wait.h>using namespace std;int main()
{printf("%d\n",getpid());sigset_t sig;sigemptyset(&sig);sigaddset(&sig,2);sigprocmask(SIG_SETMASK,&sig,nullptr);while(1){// 将正在处理的信号先将这个位置变成0,如果在处理这个信号的时候来相同信号,就会默认加入pending,默认将这个信号屏蔽sigset_t pending;sigpending(&pending);for(int i=31;i>0;i--){if(sigismember(&pending,i)) printf("1");else printf("0");}puts("");// 获取block列表,观察是否进行屏蔽——无法获取block列表sleep(1);}// signal(2,handler);while(1) ;return 0;
}

在这里插入图片描述


#include <signal.h>
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);

修改handler表对应的方法
函数机制介绍

在处理a信号的过程中,自动将a信号加入block表,直到结束自动恢复

使用举例

#include <iostream>
#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<wait.h>using namespace std;void handler(int signum)
{printf("signal: %d\n",signum);while(1){// 将正在处理的信号先将这个位置变成0,如果在处理这个信号的时候来相同信号,就会默认加入pending,默认将这个信号屏蔽sigset_t pending;sigpending(&pending);for(int i=31;i>0;i--){if(sigismember(&pending,i)) printf("1");else printf("0");}puts("");// 获取block列表,观察是否进行屏蔽——无法获取block列表sleep(1);}
}int main()
{struct sigaction act;act.sa_handler=handler;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask,3);// 将3号信号加入信号集中sigaction(2,&act,nullptr);cout<< getpid()<<endl;while(1) ;return 0;
}

在这里插入图片描述
在这里插入图片描述

sigaddset(&act.sa_mask,3); // 将3号信号加入信号集中
sigaction(2,&act,nullptr);

说明一下这个代码,意思是将3号信号加入信号集,然后将2号信号方法更新进handler表中,特别注意的是,在检测到2号信号的时候,才会将2,3信号加入block表;只发3号信号,还是像普通信号一样

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

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

相关文章

猫头虎分享已解决Bug ‍ || SyntaxError: expected expression, got ‘<‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2/10 BFS初探

其实在我看来解决全排列问题&#xff0c;核心还是顺序&#xff0c;想清楚结束条件&#xff0c;然后输出&#xff0c;以n3为例 #include<iostream> using namespace std; const int N 10; int path[N];//保存序列 int state[N];//数字是否被用过 int n; void dfs(int u) …

浅谈路由器交换结构

一、路由器技术概述 路由器&#xff08;Router&#xff09;是连接两个或多个网络的硬件设备&#xff0c;在网络间起网关的作用&#xff0c;是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。它能够理解不同的协议&#xff0c;例如某个局域网使用的以太网协议…

C++ 动态规划 记忆化搜索 滑雪

给定一个 R 行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能够滑动到某相…

AJAX——认识URL

1 什么是URL&#xff1f; 统一资源定位符&#xff08;英语&#xff1a;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff0c;或称统一资源定位器、定位地址、URL地址&#xff09;俗称网页地址&#xff0c;简称网址&#xff0c;是因特网上标准的资源的地址&…

VUE学习——数组变化侦测

官方文档 变更方法&#xff1a; 使用之后&#xff0c;ui可以直接发生改变。改变原数组 替换数组&#xff1a; 使用之后需要接受重新赋值&#xff0c;不然ui不发生改变。不改变原数组

bilibili001:计算自己收藏了多少视频

想统计一下自己B站收藏了多少视频,感谢此项目https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/fav/list.md的开发者搜集的b站api文档。获取收藏夹视频 登录用户空间详细信息,获取用户mid curl -G https://api.bilibili.com/x/space/myinfo -b SE…

无人机应用场景和发展趋势,无人机技术的未来发展趋势分析

随着科技的不断发展&#xff0c;无人机技术也逐渐走进了人们的生活和工作中。无人机被广泛应用于很多领域&#xff0c;例如遥感、民用、军事等等。本文将围绕无人机技术的应用场景和发展趋势&#xff0c;从多角度展开分析。 无人机技术的应用场景 无人机在遥感方面的应用&…

【Linux】学习-基础IO—上

Linux基础IO—上 复习c语言接口 你真的懂文件吗&#xff1f; 文件的打开与关闭 深入了解文件读与写(C语言级别) 系统文件I/O 我们知道&#xff0c;文件是放在磁盘(硬件)上的&#xff0c;我们用代码访问文件的思路是&#xff1a; 写代码 -> 编译 -> 生成可执行exe …

寒假作业:2024/2/11

作业1&#xff1a;使用递归实现n! 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int fun(int n) {if(0n){return 1;}else{return n*fun(n-1);} } int main(int argc, const char *argv[]) {int n;printf("please en…

win10彻底永久关闭自动更新的方法【已验证有效】

win10彻底关闭自动更新方法步骤&#xff1a; 由于win10自动更新非常顽固&#xff0c;所以我们要从多个地方下手才能永久关闭其自动更新&#xff0c;别怕麻烦&#xff0c;跟着下面的步骤一步步操作。 一、禁用Windows Update服务 1、同时按下键盘 Wi…

Windows mstsc远程桌面提示“身份验证错误,要求的函数不支持” 解决方案

随着Windows操作系统的不断更新&#xff0c;远程桌面连接的安全性也在逐步提高。然而&#xff0c;这也带来了一些兼容性问题。特别是当高版本的Windows操作系统尝试连接到旧版本Windows操作系统时&#xff0c;经常会出现“身份验证错误&#xff0c;要求的函数不支持”的提示。这…