<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++;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

School training competition ( Second )

A. Medium Number 链接 : Problem - 1760A - Codeforces 就是求三个数的中位数 : #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std; typedef long long LL; const int N 2e510;inline void …

详解混合整数二次规划 (MIQP) 投资组合优化问题--附Matlab和Python实现

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&am…

新手用什么工具制作电子画册?新分享

随着数字化时代的到来&#xff0c;电子画册已成为企业宣传、展示产品的重要手段。对于新手来说&#xff0c;选择一款合适的工具是关键。今天&#xff0c;为大家推荐一款适合新手制作的电子画册工具&#xff0c;让你轻松制作出精美画册。 工具推荐&#xff1a;FLBOOK在线制作电子…

快速开发出一个公司网站

问题描述&#xff1a;参加一个创业活动&#xff0c;小组要求做一个公司网站&#xff0c;简单介绍一下自己公司的业务。需要快速完成。 问题解决&#xff1a;从网上找一个网站模板&#xff0c;类似于做PPT&#xff0c;搭建一个网站即可。 这里推荐的是京美建站、wordpress、he…

【JAVA学习笔记】72 - 满汉楼 - 餐饮管理系统

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多&#xff0c;界面复杂&#xff0c;涉及到复杂的awt和swing技术和事件编程&#xff0c;做如下调整: 1.去掉界面和事件处理(工作中使用很少)&#xff0c;使…

7000字+24张图带你彻底弄懂线程池

大家好&#xff0c;我是三友。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池&#xff0c;通过画图的方式来彻底弄懂线程池的工作原理&#xff0c;以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现&#xff0…

python-爬虫(可直接使用)

爬虫&#xff08;Web Scraping&#xff09;是指通过编程自动化地获取互联网上的信息的过程。爬虫的目的通常是从网页中抓取数据&#xff0c;进行数据分析、处理或展示。以下是爬虫的基本流程和一些重要的概念&#xff1a; 爬虫基本流程&#xff1a; 确定目标&#xff1a; 确定要…

Adversarial Attack and Defense on Graph Data: A Survey(2022 IEEE Trans)

Adversarial Attack and Defense on Graph Data: A Survey----《图数据的对抗性攻击和防御&#xff1a;综述》 图对抗攻击论文数据库&#xff1a; https://github.com/safe-graph/graph-adversarial-learning-literature 摘要 深度神经网络&#xff08;DNN&#xff09;已广泛应…

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC控制器Controllers

Asp.net web应用程序MVC之Controllers控制器 Controller在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并且负责协调Model与View之间的数据传递,是ASP.NET MVC的核心。 撰写Controller的基本要求: 1、Controller必须为公开类别; 2、Controller名称必须以Controller结…

初识前后端数据交互(新手篇)

一个软件项目的开发必然是离不开前端和后端的协作&#xff0c;对于刚入行的新手前端或者新手后端来说&#xff0c;很有必要了解一下对方是在做什么&#xff0c;以及提供给自己什么样的帮助&#xff0c;为什么需要对方共同协作才能完成整个软件项目的开发呢&#xff1f;希望这篇…

14.1 USA.gov Data from Bitly(USA.gov数据集)

CHAPTER 14 Data Analysis Examples&#xff08;数据分析实例&#xff09; 14.1 USA.gov Data from Bitly&#xff08;USA.gov数据集&#xff09; 2011年&#xff0c;短链接服务&#xff08;URL shortening service&#xff09;商Bitly和美国政府网站USA.gov合作&#xff0c;…

【springboot】宝塔简单部署springboot 配置https

宝塔简单部署springboot配置https 需求步骤1. springboot通过maven组件打成jar包2. 将jar包部署到宝塔上3. 下载安装nginx并创建网站节点4. 设置域名或者IP5. 设置反向代理:代理后端服务的ip和端口7. 配置SSL/TLS 需求 宝塔部署springboot项目,用nginx反向代理后端IP端口&…

深入理解OS--数值编码

信息的表示和处理 寻址和字节顺序 位于0x100处&#xff0c;int类型值0x01234567在大端和小端下的存储。 字符串的存储不受字节序影响。 移位 1.对左移&#xff0c;右边统一补0 2.对右移&#xff0c;分为算术右移&#xff0c;逻辑右移 算术右移下&#xff0c;左边补原最高有效…

VS2022 配置Qt编译环境 | winows安装Qt5.14.2 | VS2017和Qt5配置成功指南

Visual Studio 2022安装教程完文本内容较多,请耐心看完,挺有收获的,要自己多尝试哦。 文章目录 # 插件安装 如果你想用VS2022来创建QT项目,那么你首先要学会下面的操作,创建一个空白解决方案,在扩展搜索qt,并且下载两个插件(带有绿√的就是)。这里其实是一个坑:VS20…

万宾科技第四代可燃气体监测仪的作用

燃气作为一种重要的能源已在居民生活、工业生产和商业活动等领域得到了广泛的应用。但是与之而来的便是各种各样的燃气管网的安全问题&#xff0c;其中燃气管网泄漏成为了城市生命线建设中亟待解决的安全隐患。因此采取切实有效的措施来保障燃气管网的安全运行&#xff0c;应用…

NB-IoT BC260Y Open CPU SDK④开发环境搭建

NB-IoT BC260Y Open CPU SDK④开发环境搭建 1、SDK包的介绍2、编程工具3、程序框架1、SDK包的介绍 (1)、SDK包的下载: 链接: (2)、文件目录介绍 文件名描述device启动文件、底层配置文档等doc存放 QuecOpen 项目相关的说明文档osFreeRTOS 相关代码out输出编译 App 和调…

【Python】遍历电脑中的所有文件

通过os模块中的os.walk()遍历电脑指定路径的所有文件及大小&#xff1a; import osdef traverse_files(path):file_path_list[]file_size_list[]for root, dirs, files in os.walk(path):for file in files:file_path os.path.join(root, file)file_path_list.append(file_pa…

最新版小权云黑系统 骗子添加查询源码

小权云黑系统添加骗子&#xff0c;查询骗子&#xff0c;可添加团队后台方便审核用&#xff0c;在线反馈留言系统&#xff0c;前台提交骗子&#xff0c;后台需要审核才能过&#xff0c;后台使用光年UI界面&#xff0c;新增导航列表&#xff0c;可给网站添加导航友链&#xff0c;…

爬虫系统Docker和Kubernetes部署运维最佳实践

在构建和管理爬虫系统时&#xff0c;使用Docker和Kubernetes可以带来诸多好处&#xff0c;如方便的部署、弹性伸缩和高可靠性。然而&#xff0c;正确的部署和运维实践对于确保系统稳定运行至关重要。在本文中&#xff0c;我将分享爬虫系统在Docker和Kubernetes上的最佳部署和运…