Linux:进程信号

生活角度的信号

a.信号在生活中,随时可以产生(信号的产生和我是异步的)

b.你能认识这个信号

c.我们知道信号产生了,我能识别这个信号,信号该怎么处理

d.我们可能正在做着更重要的事情,把到来的信号暂不处理(1.我记得这个事 2.合适的时候处理)

信号介绍

在bash上执行命令kill -l便可看到系统定义的所有信号

我们只研究前31个信号,后面31个是实时信号这里不做研究

每个信号都有一个编号和一个宏定义名称,这些宏定义都可以在signal.h中找到,在man手册中还可以找到各种信号的详细信息

man 7 signal

这里具体介绍了信号在什么时候产生,处理的动作是什么

信号概念的基本储备

信号:Linux系统提供的一种,向指定进程发送特定事件的方式,做识别和处理。

信号产生是异步的。

信号处理常见方式

1、忽略该信号

2、执行信号的默认处理动作(终止自己、暂停、忽略.....)

3、提供一个信号处理函数,要求内核在处理信号时切换到用户态执行这个处理函数,这种方式称为捕捉一个异常

如何理解信号的发送和保存?

进程---task_struct---struct---成员变量---用位图来保存收到的信号

uint32_t signals;

0000 0000 0000 0000 0000 0000 0000 0000

发送信号:修改指定进程pcb中的信号指定位图,0->1,写信号

pcb:内核数据结构对象,只有OS有资格修改内核结构对象中的值

信号产生具体过程

kill命令

通过kill命令向指定进程发送指定信号

kill -数字 进程号

通过终端按键来产生信号

ctrl+c  2)SIGINT 向当前进程发送2号信号

ctrl+\  3)SIGQUIT向当前进程发送3号信号

SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并Core Dump,我们在Linux环境下来验证一下,先来了解一下什么是Core Dump

当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存在磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有BUG,比如非法访问内存导致段错误,事后可以用调试器检查core文件以查清楚错误原因,这叫做事后调试,一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存在PCB中),默认是不允许改变这个限制,允许产生core文件。首先用ulimit命令来改变shell进程的Resource Limit,允许core文件最大为1024k

通过信号返回值我们发现有一个core dump位。

云服务器默认关闭这个core文件功能

ulimit -c 1024 //打开这个文件功能

写一个死循环程序

编译并执行程序:

看到的现象是先打印出pid然后一直在死循环,按下组合键ctrl+\后退出并提示core dumped

test程序也会core  dump的原因是我们先修改了shell的Resource Limit值,而test进程是由shell产生的所以test进程的PCB也是由shell复制而来,所以test进程和shell就具有相同的Resource Limit值,所以就会产生core  dump了。

如图所示就是产生的core文件

最新的Linux版本所生成的core文件没有后缀,同一个文件如果多次执行多次异常终止,那么生成的core文件还是一份。这样就避免了一份文件生成多份core文件占内存。

调用系统函数来向进程发信号

kill函数

参数解释:

第一个参数进程id

第二个参数信号标号

返回值:成功返回0失败返回-1

./mykill 2 1234int main(int argc, char *argv[]){if(argc != 3){std::cerr << "Usage: " << argv[0] << " signum pid" << std::endl;return 1;}pid_t pid = std::stoi(argv[2]);int signum = std::stoi(argv[1]);kill(pid, signum);}

raise函数

发信号给自己 == kill(getpid(), sig)

只能向当前进程发送信号

参数解释:

信号标号

返回值:成功返回0失败返回-1

#include <signal.h>
#include <stdio.h>int main()
{printf("raise befor.");raise(9);//结束自己。相当于_exitprintf("raise after.\n");return 0;
}
CLC@Embed_Learn:~/linux_io/02/02/seven$ ./a.out 
Killed       //并未打印出raise befor.,所以相当于_exit

 abort函数

函数功能:使当前进程接收到信号而异常终止

参数:无参数

返回值:无返回值

void handler(int sig){std::cout << "get a sig: " << sig << std::endl;}int main(){int cnt = 0;signal(SIGABRT, handler);while (true){sleep(1);std::cout << "hello bit, pid: " << getpid() << std::endl;abort();}}

信号虽被捕捉,但abort正常接收终止进程

signal函数

void (*signal(int signum, void (*handler)(int)))(int);

令A= void (*handler)(int) = 函数指针变量。

void (*signal(int signum, A))(int);
signal 函数有二个参数,第一个参数是一个整形变量(信号值),第二个参数是一个函数指针,是我们自己写的处理函数;
这个函数的返回值是一个函数指针。

void handler(int sig){std::cout << "get a sig: " << sig << std::endl;}int main()
{signal(SIGABRT, handler);return 0;
}

捕捉到SIGABRT信号后,可以执行我们所定义的函数,并将signum传入函数sig

注意:

该函数设置一次,进程不结束可以无限捕捉

并不是所有的信号都可以捕捉,9号信号不允许自定义捕捉

软件条件产生

#include <unistd.h>
unsigned int alarm(unsigned int seconds);
调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动 作是终止当前进程。

函数功能:

设定一个闹钟,告诉内核在seconds秒后给当前进程发送一个SIGALRM信号,该信号的默认处理动作是终止当前进程

函数参数解释:闹钟的时间是多少秒

函数返回值:这个函数的返回值是0或者闹钟剩下的秒数,

当你一直不修改闹钟,直到闹钟响这时的返回值是0

当在设定的秒数之内修改了闹钟的秒数就会返回上个闹钟剩下的时间,将seconds值设为零表示取消闹钟

void handler(int sig)
{std::cout << "get a sig: " << sig << std::endl;
}int main(){signal(SIGALRM, handler);alarm(3); // 设定1S后的闹钟 -- 1S --- SIGALRMint n =  alarm(0): 取消闹钟, 上一个闹钟的剩余时间std::cout << "n : " << n << std::endl;//3sleep(10);}

OS对闹钟如何做管理?先描述再组织  

struct alarm

{

time_t expired;//未来的超时时间=seconds+Now();时间戳

pid_t pid;

fun_t f;

.....

}

这里是用大堆或者小堆将结构体链式存储起来的

硬件异常产生信号

程序为什么会崩溃???非法访问和操作,导致OS给进程发信号

非法访问:SIGSEGV信号

非法操作:SIGFPE信号

崩溃了为什么会退出?可以不退出吗,可以。

默认是终止进程,捕捉信号即可不退出,但最好终止退出进程释放进程的上下文数据,包括溢出标志数据或者其他异常数据。

int main()
{// 程序为什么会崩溃???非法访问、操作(?), 导致OS给进程发送信号啦!! --- 为什么// signal(SIGSEGV, handler);// signal(SIGFPE, handler);//  崩溃了为什么会退出?默认是终止进程//  可以不退出吗?可以,捕捉了异常, 推荐终止进程(为什么?) --- 为什么?// int *p = nullptr;// *p = 100; // SIGSEGVint a = 10;a /= 0;      // 8) SIGFPEwhile (true){std::cout << "hello bit, pid: " << getpid() << std::endl;sleep(1);}
}

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

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

相关文章

要不还是别搞Google Play了

​好消息&#xff1a;误导性条款合规了 坏消息: 应用被暂停了&#xff0c;太难玩了 5.13日收到邮件&#xff0c;被告知应用因为应用内体验问题被暂停上架了 邮件大意是由于违反执行流程政策(Violation of Enforcement Process policy)。 这个政策主要是讲Google Play会对账户/…

求四个整数中的最大值(函数)(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a, b, c, d, max;//获取用户输入的数据&#xff1b;printf("请输入4个整数&#x…

你知道在 TS 中判断两个类型相等有多难吗?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ TypeScript 中的类型相等 如果我们想判断两个变量是否相等&#xff0c;可以简单的通过 或 来进行比较&#xff0c;但是对比两个类型则不行。 在 TypeScript 中&#xff0c;类型是静态的&#xff0c;只会在编译时…

【Esp32S3 | Arduino】在Arduino中使用C++的高级特性

文章目录 前言一、Arduino中的Vector示例代码二、Arduino中的Map示例代码前言 最近在玩Arduino,自上次发现Arduino可以用Template,能使用高级宏后,这次发现Arduino竟可以使用C++中的一些STL容器,这属实令人震惊。起因是我打算做一个动态的数组,但是手动实现一些操作属实麻烦…

Hack The Box-SolarLab

总体思路 SMB获取敏感信息->CVE-2023-33733漏洞注入->CVE-2023-32315->敏感信息泄露 信息收集&端口利用 nmap -sSVC -p1-10000 10.10.11.16发现目标开放了80、135、139、445和6791端口&#xff0c;并且对应的端口也给出了重定向的标志&#xff0c;将域名加入到…

实验过程演示【计算机网络实验】

前言 这是陈旧已久的草稿2023-05-20 11:23:54 这个是计算机网络的一个实验&#xff0c;现在也不知道这个是啥来着。 现在2024-5-12 22:33:17&#xff0c;发布到[计算机网络实验]专栏中。 实验过程演示 2023-5-18 20:17:45 1&#xff0e;搭建一个多跳网络拓扑&#xff0c;…

算法题解记录25+++验证二叉搜索树(百日筑基)

题目描述&#xff1a; 难度&#xff1a;中等 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必…

【MISRA-C-2012】:标准的理解与学习

标准的理解与学习 引用二、Misra-C 规则Misra-C全解读 - Rule 1 标准的C语言环境&#xff08;待更新&#xff09;Misra-C全解读 - Rule 2 未使用的代码&#xff08;待更新&#xff09;Misra-C全解读 - Rule 3 注释&#xff08;待更新&#xff09;Misra-C全解读 - Rule 4 字符与…

如何抠图?6个简单方便的抠图软件教你自己快速抠图

如何抠图&#xff1f;6个简单方便的抠图软件教你自己快速抠图 抠图是图像处理中常见的操作之一&#xff0c;它可以帮助我们从一幅图像中抠出特定的部分&#xff0c;通常用于制作合成图、更换背景或修改图像内容。下面介绍的6款简单方便的抠图软件可以帮助您快速进行抠图操作&a…

PyQt:界面无边框+实现窗口最小化(任务栏图标隐藏+托盘图标显示)

一、整体实现效果 诸如WX、各种管家的桌面显示方式。窗口关闭后&#xff0c;往往是任务栏图标消失&#xff0c;保持右下角托盘图标显示&#xff0c;保持后台运行。双击托盘图标后&#xff0c;窗口显示。 二、代码实现 from PyQt5.QtWidgets import * from ato_upgrade impo…

CSS常用滤镜效果

CSS 提供了多种滤镜效果&#xff0c;可以通过 filter 属性应用于 HTML 元素。以下是一些常用的 CSS 滤镜效果&#xff1a; 一、灰度 (Grayscale) 将图像转换为灰度图像。值在 0%&#xff08;原始图像&#xff09;和 100%&#xff08;完全灰度&#xff09;之间。 filter: gra…

【回溯 栈 代数系统 动态规划】282. 给表达式添加运算符

本文涉及知识点 回溯 栈 代数系统 动态规划 LeetCode 282. 给表达式添加运算符 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target &#xff0c;在 num 的数字之间添加 二元 运算符&#xff08;不是一元&#xff09;、- 或 * &#xff0c;返回 所有 能够得到 ta…

Ngnix VTS模块添加和测试

目录 VTS模块介绍 上传软件包xftp/lrzsz 执行脚本 添加vts的配置 测试 测试&#xff1a;nginx.conf配置文件是否有语法错误 测试&#xff1a;windows机器上访问效果 VTS模块介绍 Nginx VTS模块&#xff08;nginx Virtual Host Traffic Status Module&#xff09;是一个第三…

【C++初阶】string模拟实现

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

【精读Yamamoto】方向性连接如何丰富神经网络的功能复杂度 | 体外神经元培养实验 | 脉冲神经元模型(SNN) | 状态转移模型

探索大脑的微观世界&#xff1a;方向性连接如何丰富神经网络的功能复杂度 在神经科学领域&#xff0c;理解大脑如何通过其复杂的网络结构实现高级功能一直是一个核心议题。最近&#xff0c;一项由Nobuaki Monma和Hideaki Yamamoto博士领导的研究为我们提供了新的视角&#xff…

cuttag学习笔记

由于课题可能用上cut&tag这个技术&#xff0c;遂跟教程学习一波&#xff0c;记录一下以便后续的学习&#xff08;主要是怕忘了&#xff09; 教程网址cut&tag教程 背景知识&#xff1a;靶标下裂解与标记&#xff08;Cleavage Under Targets & Tagmentation&#xf…

90后医生下班摆摊就能赚1500?看内行人是如何分析的?2024普通人逆袭的机会,2024普通人想翻身的风口行业

“在自己空余的时间&#xff0c;做点自己喜欢的事情”这就是浙江义乌的王医生&#xff0c;摆摊被采访时的回答。王大夫说&#xff0c;自己兼职已经有半年多了&#xff0c;每天的营业额能达到1500元。同时王医生表示&#xff0c;自己的目标是开一间自己的小店。 看到这里&#x…

新版Idea配置仓库教程

这里模拟的是自己搭建的本地仓库环境&#xff0c;基于虚拟机搭建利用gogs创建的仓库 1、Git环境 你需要准备好git和仓库可以使用github 、gitee等 1.1 拉取代码 本项目使用 Git 进行版本控制&#xff0c;在 gogs 上创建一个个人使用的 git 仓库&#xff1a; http://192.168.…

1.5.2 基于XML配置方式使用Spring MVC

用户登录演示效果 实战概述&#xff0c;可以帮助你更好地理解整个流程。 项目创建 创建了一个名为 SpringMvcDemo01 的 Jakarta EE 项目。通过 Maven 添加了项目所需的依赖&#xff0c;包括 Spring MVC、JSTL 等。 视图层页面 创建了登录页面&#xff08;login.jsp&#xff0…

计算机毕业设计springboot体育馆场地预约管理系统【附源码】

计算机毕业设计springboot体育馆场地预约管理系统[附源码] &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制…