当前位置: 首页 > news >正文

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 5》(9)

《Linux操作系统原理分析之Linux 进程管理 5》(9)

  • 4 Linux 进程管理
    • 4.5 Linux 信号
      • 4.5.1 信号的作用和种类
        • 1.信号机制
        • 2.信号种类
      • 4.5.2 信号的处理
      • 4.5.3 信号处理函数
        • 1.数据结构
        • 2. 处理函数 signal
        • 3.程序例

4 Linux 进程管理

4.5 Linux 信号

4.5.1 信号的作用和种类

1.信号机制
概念说明
信号机制通信传输的本质传输称为信号的数值。
信号主要作用把系统中发生的某些事件通知给进程。
信号主要特征异步性:即什么时候出现信号是不可预知的。
信号数量它与硬件机器的字长相对应。如 80x86 的字长 32 位,则信号有32 种。
信号数量定义在哪里include/asm-i386/signal.h
信号值系统中每个信号都是一个整数,称为信号值。
信号名为了清楚地表示信号的意义,linux 通过宏定义给每个信号都定义了一个符号常量,称为信号名。
信号名格式。Linux 的信号名的组成以 SIG 打头,后面跟着表示信号意义的英文缩写。
2.信号种类
信号值信号名信号意义缺省处理
0用作特殊情况处理
1SIGHUP进程的控制终端或控制进程已结束终止进程
2SIGINT用户键入ctrl-c终止进程
3SIGQUIT从键盘来的终止信号(quit)终止进程、core转储
4SIGILL进程执行了非法指令或企图执行数据段终止进程、core转储
5SIGTRAP跟踪中断、执行trap指令终止进程、core转储
6SIGABRT进程发现错误并调试abort终止进程、core转储
7SIGBUS进程访问非法地址、地址对齐出错终止进程、core转储
8SIGFPE进程浮点运算错误、溢出、除数为0等终止进程、core转储
9SIGKILL强制终止进程(本信号不能屏蔽)终止进程(不能忽视)
10SIGUSR1保留给用户自行定义信号终止进程
11SIGSEGV进程访问内存越界,或无访问权限终止进程、core转储
12SIGUSR2保留给用户自行定义信号终止进程
13SIGPIPE进程向无读者的管道执行写操作终止进程
14SIGALRM时钟定时信号,由系统调用alarm发出终止进程
15SIGTERM结束信号,由kill命令产生终止进程
16SIGSTKFLT进程发现堆栈溢出错误终止进程、core转储
17SIGCHLD子进程结束或终止忽视
18SIGCONT让暂停的进程继续执行终止进程
19SIGSTOP暂停进程的执行(不能屏蔽)暂停进程(不能忽视)
20SIGTSTP用户键入暂停(通常是ctrl-z)暂停进程
21SIGTTIN后台作业要从用户终端(stdin)读数据暂停进程
22SIGTTOU后台作业写用户终端(stdout)暂停进程
23SIGURG套接字(socket)有“紧急”数据到达忽视
24SIGXCPU进程使用CPU超时终止进程、core转储
25SIGXFSZ进程处理文件超长终止进程、core转储
26SIGVTALRM虚拟时钟信号(计算进程占用CPU时间)终止进程
27SIGPROF类似SIGALRM/SIGVTALRM(计算进程占用CPU时间以及系统调用的时间)终止进程
28SIGWINCH终端窗口大小已改变忽视
29SIGIOI/O准备就绪,可以进行输入/输出操作忽视
30SIGPWR系统电源失效
31SIGUNUSED未使用

信号产生的三种情况:
1.进程在执行过程中发生了某种错误,标志被置位,系统内核识别到错误标志,向有关进程发送相应信号,通知进程发生了运行错误。
2.系统或用户发出的控制进程终止或暂停的信号。
3.内核需要控制进程的运行而产生的信号。

4.5.2 信号的处理

1. 在进程的任务结构体 task_struct 中有两个成员项用于处理接收的信号:

Unsigned long signal;
Unsigned long blocked;

它们都是位域(Bitmap)形式的 32 位 unsigned long 型变量,每一位(bit)对应一种信号。变量的第 0位对应信号值为 1 的 SIGHUP,第 1 位对应信号值为 2 的 SIGINT,依此类推。
1)Signal:存放进程收到且尚未处理的信号。

进程可以同时接收多个信号
每种信号在 signal 中只有一位,故不能识别接收了一个还是多个同一个信号
信号没有优先级,可以以任意顺序处理接受到的信号

2) Blocked:通过将 blocked 中的某一位设置为 1,来屏蔽某种信号的处理。但是有两个不能屏蔽的信号(SIGKILL 和 SIGSTOP)是不能被屏蔽的,blocked 中它们对应的位始终为 0;

2.进程接收到信号后的两种处理方式:

交给内核进行处理(缺省方式)

由进程自行处理

1)其中 core 转储指把该进程内存中的有关信息进行转储(dump),生成 core 文件。在使用 gdb 调试工具对程序进行调试时,通常需要使用 core 文件。
2)进程接收到信号后有其自行处理成为信号的捕获,但是信号 SIGKILL 和 SIGSTOP 不能有进程捕获,他们必须由内核进行处理。
3)信号无论是由内核或是进程处理,都可以 被忽视,即不进行任何处理,但是信号 SIGKILL 和SIGSTOP 不能被忽视。

4.5.3 信号处理函数

1.数据结构

当进程接收到信号,并且该信号没有被阻塞的话,进程就执行信号处理函数完成对信号的处理,每种信号都有其对应的处理函数,进程对所有信号处理函数集中由 signal_struct 结构体来管理,进程任务结构体中成员项 sig 指向该结构体。在 include/linux/sched.h 中定义了 signal_struct 结构体:

Struct signal_struct{
Int count;
Struct sigaction action[32]};

count:共享处理信号函数的计数值。一般是子进程继承父进程的信号机制时的计数。
action[]:是该进程的信号处理函数表,32个元素对应 32 种信号。该数组是 sigaction 结构体,它定义在/ include/asm-i386/signal.h 中

Struct sigaction {
_sighandler_t sa_handler;
Sigset_t sa_mask;
Unsigned long sa_flags;
Void(*sa_restorer)(void);
};

sa_handler 是指向信号处理函数的指针,通常是用户自行设定的信号处理函数。当 sa_handler 的值是系统定义的以下符号常量时,它不是信号处理函数的入口地址,其值和意义如下:
SIG_DEL 0 缺省处理,由内核执行系统设定的信号处理函数
SIG_IGN 1 忽视信号,不进行信号处理
SIG_ERR -1 信号处理时返回的错误,一般用于判断函数的返值是 否正确。

sa_mask 是一个信号屏蔽码,当进程处理某一个信号时,它被逻辑加(OR)到接收进程的信号 屏蔽码 blocked 上,进程信号屏蔽码的这种改变只是在信号处理期间有效,其目的是在进程执行 信号处理过程中屏蔽其它到达的信号。

sa_flags 是信号处理标志,主要有
SA_ONESHOT 信号到达时,启动信号处理函数
SA_NOMASK 不使用 sa_mask改变进程的信号屏蔽码

sa_restorer 是一个函数指针,目前未用,保留以供扩充。

在这里插入图片描述

2. 处理函数 signal

Linux 系统提供了用户自己设置信号处理函数的方法,它由系统调用 signal()完成。在 signal()中进一步调用内核函数 sys_signal()实现函数设置的功能。该内核函数定义在 kernal/signal.c 中:

Asmlinkage unsigned long sys_signal(int signum,_sighandler_t handler);

参数说明:

signum:信号值,指明要设置哪个信号的函数;
handler:用户设置的处理函数的首地址。(也可以是 SIG_DEL、SIG_IGN)

函数简要说明:

Struct sigaction tmp;/*用于暂存信号处理函数的有关信息。*/If(signum<1|| signum>32returnEINVAL; /*判断 signum 给定的信号值是否合理*/
If(signum==SIGKILL||signum==SIGSTOPreturnEINVAL; /*若为这两个信号,则不能被捕获,即用户不能为它们设定处理函数*/
If(handler!=SIG_DFL&& handler!=SIG_IGN/*若信号不是指定为缺省处理或
{ 忽视,则确认给定的处理函数使用存储空间的有效性*/
Err = verify_area(VERIFY_READ,handler,1)If(err)return err;
}

经过上面的检查确认后,开始使用 tmp 设置进程的 sigaction 结构体。

Memset&tmp,0,sizeof(tmp); /* 首先把该结构的存储空间全部清 0*/
Tmp.sa_handler =handler;/*把参数 handler 指定的信号函数处理函数首地址置入 tmp 的sa_handler*/
Tmp.sa_flags = SA_ONESHOT|SA_NOMASK; /*设置 sa_flag*/
Current->sig->action[signum-1]=tmp; /*把 tmp 的内容复制到当前进程的处理信号函数表中与指定信号对应的数组元素中。*/
Check_pending(signum); /*设置当前进程任务结构体的 signal 成员项*/
Return(unsigned long)handler; /*返回 handler 的值,即原信号处理函数的首地址*/
3.程序例
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
Int count=0;
Void ctrl_c_count(int);
Main()
{
int c;
void(*old_handler)(int);
old_handler=signal(SIGINT,ctrl_c_count);
while((c=getch()!=”\n”);
printf(Ctrl_C count=%d\n”,count);
signal(SIGINT,old_handler);
}
Void ctrl_c_count(int dump)
{
Printf(Ctrl_C\n”);
Count++;
}

相关文章:

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 5》(9)

《Linux操作系统原理分析之Linux 进程管理 5》&#xff08;9&#xff09; 4 Linux 进程管理4.5 Linux 信号4.5.1 信号的作用和种类1.信号机制2.信号种类 4.5.2 信号的处理4.5.3 信号处理函数1&#xff0e;数据结构2&#xff0e; 处理函数 signal3&#xff0e;程序例 4 Linux 进…...

Anthropic推出Claude 2.1聊天机器人;使用AI工具写作:挑战与策略

&#x1f989; AI新闻 &#x1f680; Anthropic推出Claude 2.1聊天机器人&#xff0c;支持20万个Token输入和提高准确度 摘要&#xff1a;Anthropic推出了Claude 2.1聊天机器人及对应的AI模型&#xff0c;支持输入多达20万个Token&#xff0c;并在准确度上有所改善。Claude已…...

2023-11-30 LeetCode每日一题(确定两个字符串是否接近)

2023-11-30每日一题 一、题目编号 1657. 确定两个字符串是否接近二、题目链接 点击跳转到题目位置 三、题目描述 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&…...

进程间通信基础知识【Linux】——上篇

目录 一&#xff0c;理解进程之间的通信 1. 进程间通信目的 2. 进程间通信的技术背景 3&#xff0c;常见的进程间通信 二&#xff0c;管道 1. 尝试建立一个管道 管道的特点&#xff1a; 管道提供的访问控制&#xff1a; 2. 扩展&#xff1a;进程池 阶段一&#xff1a…...

OpenSSH(CVE-2023-38408)OpenSsh9.5一键升级修复

yum install -y git cd /root git clone https://gitee.com/qqmiller/openssh-9.5p1-.x86_64.git cd openssh-9.5p1-.x86_64/ bash openssh_update.sh重启sshd&#xff1a; systemctl restart sshd 查看sshd状态&#xff1a; systemctl status sshd 重要的是按此操作升级完成…...

10.30 作业 C++

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std;clas…...

Python开发运维:PyMongo 连接操作 MongoDB

目录 一、理论 1.PyMongo模块 2.Mongo Shell 二、实验 1. Windows11安装MongoDB 7.0.4 2.Windows11安装MongoDB Shell 2.1.0 3.PyMongo 连接 MongoDB&#xff08;无密码方式&#xff09; 4.PyMongo 连接 MongoDB&#xff08;有密码方式&#xff09; 5.PyMongo 操作 Mo…...

【Github】本地管理github分支

本地管理github分支 学习一些开发tips。以下是万能的GPT教我的&#xff1a; 以下是一套基本的本地管理 GitHub 仓库的指令集。在执行这些指令之前&#xff0c;请确保已经在你的本地机器上安装了 Git 工具&#xff0c;并且已经在 GitHub 上创建了一个仓库。 克隆仓库&#xff1…...

Spring Boot 项目中读取 YAML 文件中的数组、集合和 HashMap

在 Spring Boot 项目中&#xff0c;我们经常使用 YAML 文件来配置应用程序的属性。在这篇博客中&#xff0c;我将模拟如何在 Java 的 Spring Boot 项目中读取 YAML 文件中的数组、集合和 HashMap。 1. 介绍 YAML&#xff08;YAML Aint Markup Language&#xff09;是一种人类…...

Python正则表达式:match()和search()函数全面解读

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;正则表达式是强大的工具&#xff0c;能够用于文本匹配、搜索和替换。re模块提供了许多函数来处理正则表达式&#xff0c;其中match()和search()是两个常用的函数。本文将深入探讨这两个函…...

AIGC ChatGPT4总结Linux Shell命令集合

在Linux中,Shell命令的数量非常庞大,因为Linux提供了各种各样的命令来处理系统任务。这些命令包括GNU核心工具集、系统命令、shell内置命令以及通过安装获得的第三方应用程序命令。以下是一些常见的Linux命令分类及其示例,但请注意,这不是一个全面的列表,因为列出所有命令…...

力扣labuladong——一刷day61

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣865. 具有所有最深节点的最小子树二、力扣1123. 最深叶节点的最近公共祖先三、力扣1026. 节点与其祖先之间的最大差值四、力扣1120. 子树的最大平均值 …...

nacos配置变更导致logback日志异常

问题背景: 线上的服务突然内存爆满&#xff0c;查服务器突然发现&#xff0c;日志全部打印到了/tmp/tomcat.xxx.port目录下&#xff0c;后来对应操作时间&#xff0c;和nacos修改配置是同一时间发生的&#xff0c;但是疑惑的点是&#xff0c;nacos配置变更为什么会引起logback的…...

【spring(五)】SpringMvc总结 SSM整合流程

目录 一、SpringMVC简介&#xff1a; 二、SpringMVC快速入门&#xff1a; 三、SpringMVC bean的管理&#xff1a;⭐ ①配置bean ②扫描bean 四、SpringMVC配置类&#xff1a;⭐ 五、SpringMVC 请求与响应 六、SpringMVC REST风格 七、SSM整合 异常处理&#xff1a; 八、…...

1、windows10系统下Qt5.12.0与卸载

一、安装包下载 1、Qt社区下载 https://download.qt.io/archive/qt/5.12/5.12.10/qt-opensource-windows-x86-5.12.10.exe 2、百度网盘下载 链接&#xff1a;百度网盘 请输入提取码 3、Qt官网下载&#xff1a; Try Qt | 开发应用程序和嵌入式系统 | Qt 二、安装提示 下…...

WebGL/threeJS面试题扫描与总结

什么是 WebGL&#xff1f;什么是 Three.js&#xff1f;请解释three.js中的WebGL和Canvas的区别&#xff1f; WebGL(全写Web Graphics Library)是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个…...

Qt connect()方法Qt::ConnectionType

connect() Qt&#xff0c;绑定信号和槽原型&#xff1a; static QMetaObject::Connection connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member, Qt::ConnectionType Qt::AutoConnection);static QMetaObject::Connection conn…...

HIVE SQL时间函数

目录 current_timestamp()获取当前时间unix_timestamp()获取当前时区的UNIX时间戳from_unixtime()时间戳转日期函数unix_timestamp(string date)日期转时间戳函数提取日期中的年月日时分秒weekofyear (string date)日期转周函数日期比较函数datediff(string enddate, string st…...

linux磁盘的LVM、交换分区以及文件系统

目录 逻辑卷LVM LVM管理 LVM特点 LVM的制作 创建物理卷 创建卷组 创建逻辑卷 格式化文件系统 挂载逻辑卷 LVM的扩容 添加硬盘做物理卷 卷组扩容 扩容逻辑卷 给文件系统扩容 LVM移除 LVM的缩容 交换分区 查看当前交换分区&#xff1a;free Swap&#xff1a;虚…...

【HDFS】ActiveNamenodeResolver#getNamespaces 方法调用点梳理

获取所有的注册在router里的active状态的集群。 /*** Get a list of all namespaces that are registered and active in the* federation.** @return List of name spaces in the federation* @throws IOException Throws exception if the namespace list is not* av…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...