深度剖析Linux信号机制

2023-09-15 09:51:29

信号的概念

Linux中的信号是进程异步通信的一种方式。

当某个信号发送到一个进程上,那么该进程就会分析该信号是什么信号,进而做出不同的处理动作。

信号的分类

信号分为两类:不可靠信号与可靠信号。

不可靠信号(1-31):也称为非实时信号,不支持排队,可能会丢失(当相同信号发送多次时,效果相当于发送一次);

可靠信号(34-64):也称为实时信号,支持排队,不会丢失。

本章节只讨论不可靠信号。

image-20230914215256257

信号的产生方式

从键盘获取

比如:

Ctrl + c向进程发送2号信号SIGINT

Ctrl + \向进程发送3号信号SIGQUIT

Ctrl + z向进程发送20号信号SIGTSTP

通过系统调用

比如:

kill系统调用可以向指定进程发送指定信号

kill命令可以向指定进程发送指定信号(kill命令内部就是调用了kill系统调用)

raise函数可以向调用进程发送指定信号(就相当于kill(getpid(), signo)

abort函数可以向调用进程发送6号信号SIGABRT(就相当于kill(getpid(), 6)

硬件异常

比如在代码中进行了除零运算或者野指针访问,那么OS会自动向该进程发送8号信号SIGPIPE或11号信号SIGSEGV

OS是如何知道该进程进行了除零运算或野指针访问的呢?其实CPU中有一个状态寄存器,该寄存器有很多标志位,能够存储当前运算结果的某些特定状态信息(进位、溢出、零值等),OS通过访问该状态寄存器里的标志位,就能够知道当前进程发生了哪些错误进而发送对应的信号。

软件条件

像alarm函数,可以设定一个闹钟,在铃响的时候由OS向调用进程发送14号信号SIGALRM

如何处理信号的到来

当信号到来时,会有三种动作:

  1. 默认处理动作(信号到来时,进行由官方人员写好的处理动作,绝大部分是中止进程)
  2. 忽略动作(信号到来时,对该信号不进行任何处理动作)
  3. 自定义动作(信号到来时,进行自己编写好的处理动作)

只有第三种动作,我们才能让指定信号到来时进行自己想要的动作,那么此时我们就必须有一个函数,能够让我们进行“注册”(对某种信号注册自定义动作)。signal函数就是用来进行注册的。

void handler(int signo) {                                                                            
     /*自定义动作*/
}
int main() {
    signal(SIGINT, handler); /*运行注册函数,完成对SIGINT信号的自定义动作的注册*/
    // 下面就是正常要写的代码
    while(1);
    return 0;
}

但是有些信号还是无法进行注册的,比如9号信号SIGKILL

sigaction函数也可以完成上面的操作。

信号的更深入剖析

  • 实际执行信号的处理动作叫做信号递达
  • 信号从产生到递达之间的状态叫做信号未决
  • 一个信号是可以被阻塞的,当该信号被阻塞时,该信号不会进行信号递达,只能保持在信号未决,当阻塞被解除时才会进行信号递达

在进程PCB中有两个位图(pending位图和block位图)

  • pending位图(32位整形):每一个bit位标识了一种信号,bit位上的内容表示该信号是否到来(是否处于信号未决状态)
  • block位图(32位整形):每一个bit位标识了一种信号,bit位上的内容表示该信号是否被阻塞

还有一个函数指针数组:大小为32,每个指针都是对应信号的处理动作

image-20230915084830143

信号的处理动作是何时进行的?

是在内核态转变为用户态的时候!

image-20230915091247721

当我们每次从内核态切换的时候,都会进行一次信号检测,检测pending位图中有没有需要处理的信号,当这些信号的动作是默认动作或者忽略动作时,直接就又返回用户态了。而当这些信号的动作是自定义动作时,会返回用户态执行handler自定义动作,执行完之后,返回内核态,然后再返回用户态。

当有一大批同种信号到来时会怎样?

首先pending位图该标志位置1,然后当信号检测时发现该信号到来了,那么就把该标志位置0同时block的该标志位置1,再去执行该信号的动作,假设该动作持续时间很长(比如handler中一直在循环),然后又有同种信号来了,此时pengding位图此标志位仍然置1,但此时该信号已经被阻塞(屏蔽)了,此后如果一直来同种信号,那么该标志位一直置1。当handler执行完了后,block上的该位会置0(解除该信号的屏蔽),由于在内核态返回用户态的过程中又会进行一次信号检测,此时由于pengding位图中的该标志位置1,block置0,所以又会进行一次该信号的handler动作。

所以,当一大批同种信号到来时,一般会按顺序执行两次该信号的处理动作。

Linux也提供了一批信号相关的系统调用

处理信号集

#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);

设置block信号集

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

获取pending信号集

#include <signal.h>
int sigpending(sigset_t *set);
更多推荐

【网络技术】TCP详解

1TCP是什么TCP是TransmissionControlProtocol的缩写,即传输控制协议。TCP是一种面向连接的、可靠的、基于字节流的传输协议,是互联网通信协议TCP/IP中的一个重要组成部分。2三次握手三次握手的过程可以用以下图示表示:2.1详细介绍TCP协议使用三次握手(Three-wayhandshak

使用VScode SSH公网远程连接本地服务器开发【无公网IP内网穿透】

文章目录前言1、安装OpenSSH2、vscode配置ssh3.局域网测试连接远程服务器4.公网远程连接4.1ubuntu安装cpolar内网穿透4.2创建隧道映射4.3测试公网远程连接5.配置固定TCP端口地址5.1保留一个固定TCP端口地址5.2配置固定TCP端口地址5.3测试固定公网地址远程前言远程连接服务器工具

Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性

Vue3(1)目录Vue3(1)一、Vue3简介二、创建Vue3.0工程1、使用vue-cli创建2、使用vite创建三、常用的CompositionAPI(组合式API)1、拉开序幕的setup2、ref函数3、reactive函数4、Vue3中响应式原理(1)Vue2中响应式原理(2)Vue3中的Proxy(3)V

【C++STL基础入门】list改、查操作

文章目录前言一、list查操作1.1迭代器循环1.2for_each函数二、list改操作2.1迭代器修改2.2assign函数2.3=运算符总结前言C++标准模板库(STL)是C++语言中非常重要的部分,它提供了一组通用的模板类和函数,用于处理常见的数据结构和算法问题。其中之一是list(链表),它是一种双向链表容器

TOWE一转二家用无线遥控插座,让生活变得简单

随着科技的进步,人们的生活方式正在发生改变,越来越多的智能家居产品进入我们的生活中,为我们的生活带来了极大的便利。无线遥控插座作为一种集成了无线遥控技术与插座功能的创新产品,在家庭、办公、商业场景有着广泛的应用。同为科技(TOWE)一转二家用无线遥控插座是TOWE专为万物互联时代潮流趋势下开发的场景应用产品,为用户各类

python学习之【包和内置模块】

前言接上篇文章python学习之【模块】,这篇文章接着学习python中的包。python中的包包是一种用“点式模块名”构造Python模块命名空间的方法。在包中存放着一些功能相近的模块。包的创建和导入包的创建我们可以在pytarm中创建一个package文件,当我们创建完成后会自动创建一个__init__.py文件,

【Vue+NodeJS】vue路由及NodeJS环境搭建(Windows版)

一、Vue路由1、什么是Vue路由Vue路由是Vue.js框架中用于实现单页面应用(SPA)的路由管理器。它允许您创建多个页面之间的导航,并通过URL的变化来动态加载不同的组件。Vue路由通过声明式的方式定义页面的导航规则,并提供了一些内置的导航组件和功能,如路由链接、路由视图和导航守卫。通过Vue路由,您可以定义不同

数据预处理方式合集

删除空行#delallNonevaluedata_all.dropna(axis=1,how='all',inplace=True)删除空列#delallNonevaluedata_all.dropna(axis=0,how='all',inplace=True)缺失值处理观测缺失值观测数据缺失值有一个比较好用的工具包

蓝桥杯 题库 简单 每日十题 day6

01删除字符题目描述给定一个单词,请问在单词中删除t个字母后,能得到的字典序最小的单词是什么?输入描述输入的第一行包含一个单词,由大写英文字母组成。第二行包含一个正整数t。其中,单词长度不超过100,t小于单词长度。输出描述输出一个单词,表示答案。输入输出样例示例1输入LANQIAO3输出AIAO#include<st

【物联网】常见电子元器件(电阻、电容、电感、二极管、三极管)综合,详细分析原理及其应用

电子元器件是现代电子技术的基础,它们在各个领域中发挥着重要作用。从三极管到电容器、电阻器,这些常用元器件承担着放大、开关、滤波等关键任务。它们的特性和组合方式决定了电路的性能和功能。本文将介绍常用电子元器件的工作原理和应用场景,帮助读者更好地理解和运用它们。无论是电子爱好者还是专业工程师,对于电子元器件的了解都是必不可

走进人工智能| 智能物联网 AIoT的魅力交织

前言:AI+IoT是指人工智能(AI)与物联网(IoT)的结合。智能物联网是一种技术体系,通过连接和集成物理设备、传感器和互联网,实现设备之间的智能交互和数据共享,为人们提供智能化、自动化和高效化的生活和工作体验。文章目录序言背景领跑巨头核心技术支持目前形式发展的困难点总结序言智能物联网(InternetofThing

热文推荐