Linux信号:信号的概念及意义

目录

一、什么是信号

kill-l查看信号

二、信号的产生

2.1系统调用

kill

raise

abort

2.2软件条件

13)SIGPIPE pipe信号

14)SIGAKARM alarm信号

2.2硬件中断

2.3异常

8)SIGFPE 除0异常

11)SIGSEGV 野指针

2.4信号处理的常见方式

三、Core Dump和term

core

term


一、什么是信号

在日常生活中有很多和信号有关的例子,红绿灯不同的颜色代表不同的信号,汽车碰到人按喇叭代表提醒你有车的信号,跑步枪响代表跑步的信号,我们不知道信号合适会出现,但在信号出现时,我们都知道此信号代表着我们应该进行什么样的动作,而在linux操作系统中亦是如此,只不过此时发出信号的一方变成了OS或者是用户,接收信号量的一方变成了进程。
而在Linux中的信号则具有以下几种特征,也是进程看待信号的方式:
Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式
1、在没有发生的时候,我们已经知道发生的时候该怎么处理了。
2、信号我们能够认识,很早之前就已经被设置了识别特别待定信号的方式。
3、信号到来的时候,正在处理更重要的事情,暂时不能处理到来的信号,必须暂时要将到来的信号进行临时保存(保存在进程PCB中)。
4、信号到了,可以不立即处理,可以在合适的时候处理。
5、信号的产生是随时产生的,我们无法准确预料,所以信号是异步发送的。
信号的产生是由别人(用户/进程)产生的,收到之前,该进程一直在执行自己的代码,所以是并发在跑的。

kill-l查看信号

二、信号的产生

2.1系统调用

系统调用作为C/C++学习过程中是必不可少的一个内容,因为安全性和操作系统的规则,用户想要执行某些系统层面的操作时,必须通过系统调用来让操作系统执行,而之前提到的kill指令就是通过系统调用来实现的。

kill

 通过kill可以向任意的进程发送任意的信号。

raise

自己给运行自己的进程发送信号。

abort

终止自己,向自己发送6号信号。

2.2软件条件

13)SIGPIPE pipe信号

在博主之前的文章中曾详细介绍过pipe的使用,管道是一个文件,本质是软件,管道写端退出了,读端一直在读,操作系统就会认为条件不满足,就会发13号信号让该进程退出。

14)SIGAKARM alarm信号

 设置一个闹钟,到了时间执行对应指令,默认动作时term终止进程。

#include <unistd.h>
unsigned int alarm(unsigned int seconds);
调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动
作是终止当前进程。
这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。打个比方,某人要小睡一觉,设定闹钟为30分钟之后响,20分钟后被人吵醒了,还想多睡一会儿,于是重新设定闹钟为15分钟之后响,“以前设定的闹钟时间还余下的时间”就是10分钟。如果seconds值为0,表示取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数。
alarm(0) 取消闹钟

闹钟函数是一个系统调用,设定闹钟,本质是在OS内部设定的,操作系统要定期将用户级的数据从缓冲区刷新到外设,此时就要求操作系统具有定时功能, 所以操作系统内部存在很多闹钟,所以就需要先描述再组织,此时就有一个alarm结构体,而判断闹钟是否到了时间只需要将闹钟设置的时间和现在的时间进行比较,如果时间到了就触发,所以我们可以建立一个最小堆,每次只需要判断堆顶的数据是否超时就可以。

2.2硬件中断

1. 用户输入命令,在Shell下启动一个前台进程。
用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程前台进程因为收到信号,进而引起进程退出。
而键盘是如何转变为信号从而被进程识别的呢?
首先键盘按下以后有两种情况,一种是正常作为 字符输入,一种是 组合键输入组合键输入的是命令。由OS来判断输入的是字符还是命令。而操作系统得知是否有数据输入就是采用中断的方式。
OS中存在一个中断向量表,CPU在执行代码时如果用户输入组合键,CPU就会有特定的针脚收到键盘传来的高电频,从而触发硬件中断,而每个针脚都有编号,而这个编号就叫中断号,然后将中断号放到寄存器中,然后OS拿着中断号去向量表执行相关方法,然后将字符放到键盘缓冲区。
如果输入的ctrl+c OS就把其解释为2号信号然后发给进程  。
硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。
        

2.3异常

8)SIGFPE 除0异常

11)SIGSEGV 野指针

2.4信号处理的常见方式

1. 忽略此信号。
2. 执行该信号的默认处理动作。
3. 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。

三、Core Dump和term

首先解释什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。 首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K: $ ulimit -c1024。

在Linux信号中,绝大部分信号都会执行core或term,其效果都是终止进程,那么二者之间有什么区别呢。

core

比如代码发生除0错误时就会引发core,此时编译器会报错,但在当前目录下依旧会形成可执行文件,此时执行可执行文件就会出现Float Point exception 也就是除0错误。

ulimit-a查看core是否被打开

ulimit-c num打开core dump功能,num按需求去取,单位是block,此时当前目录下就会形成一个core文件。

再次运行除零错误的代码依旧会报错,Float Point exception (core dumped)。

所以为什么要有core文件呢?OS可以通过core文件定位到进程为什么退出,以及执行到哪一行退出的。

core文件是什么呢?将进程在内存中的核心数据(与调试有关)转储到磁盘中形成core/core.pid的文件。

而core文件的功能就是协助我们进行调试。

以下运行一个代码,假设代码中包含除0错误,生成可执行后,gdb可执行程序,输入 core-file指令就会显示出代码出问题的行数。

  这种方式也叫事后调试。

而云服务器一般都是默认关闭核心转储功能,也就是默认将进程core退出,进行了特定的设定,默认core是被关闭的。

在线上服务中,最重要的就是让服务功能持续的跑起来,而一旦代码出现问题,如果此时core是开启的就会在当前路径下形成一个core文件,core文件也是很大的,如果问题没有得到及时的解决,可能os就会一直形成core文件,从而不断的占用磁盘空间。主要是防止未知的core dump一直在进行。

而在unbuntu中即使打开了core也不会像centos下在core文件后缀pid,这样即使一直生成core文件也只会在当前目录下反复覆盖生成一个core,就很好的规避了上述问题。

 而在进程控制中的这个core dump标志就表示是否发生了核心转储,为0表示没有发生,1表示发生了。 

term

term就是正常的直接退出

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

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

相关文章

docker如何拉取redis最新镜像并运行

要拉取Docker Hub上最新版本的Redis镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull redis:latest 这里的latest标签会自动获取Redis镜像的最新版本。如果您希望指定一个确切的版本号&#xff0c;可以直接使用该版本号替换latest。例如&#xff0c;要拉取Redis版…

Python | Leetcode Python题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution:def sortedArrayToBST(self, nums: List[int]) -> TreeNode:def helper(left, right):if left > right:return None# 选择任意一个中间位置数字作为根节点mid (left right randint(0, 1)) // 2root TreeNode(nums…

计算机网络数据链路层知识点总结

3.1 数据链路层功能概述 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;数据链路层的研究思想 &#xff08;3&#xff09;数据链路层基本概念 &#xff08;4&#xff09;数据链路层基本功能 3.1 封装成帧和透明传输 &#xff08;1&#xff09;数据链路层功能…

上海亚商投顾:三大指数均跌超1.3%,全市场下跌个股超4600只

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;三大股指均跌超1.3%。PEEK概念股逆势大涨&#xff0c;肯特股份、沃特股份涨停&a…

[STM32-HAL库]AS608-指纹识别模块-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录 一、前言 二、详细步骤 1.光学指纹模块 2.配置STM32CUBEMX 3.程序设计 3.1 输出重定向 3.2 导入AS608库 3.3 更改端口宏定义 3.4 添加中断处理部分 3.5 初始化AS608 3.6 函数总览 3.7 录入指纹 3.8 验证指纹 3.9 删除指纹 3.10 清空指纹库 三、总结及资源 一、前言 …

AI赋能 企业智能化应用实践

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言云定价优化语音助手与聊天机器人预测性维护客服运营自动化低功耗微处理器神…

无线网络安全技术基础

无线网络安全技术基础 无线网络安全风险和隐患 随着无线网络技术广泛应用,其安全性越来越引起关注.无线网络的安全主要有访问控制和数据加密,访问控制保证机密数据只能由授权用户访问,而数据加密则要求发送的数据只能被授权用户所接受和使用。 无线网络在数据传输时以微波进…

微软MSBuild大会发布Copilot+PC:技术革新还是隐私噩梦?

微软在最近的MSBuild 2024大会上发布了全新的CopilotPC概念&#xff0c;这一技术结合了高通骁龙X Elite芯片&#xff0c;将人工智能与PC紧密结合。此次发布引起了广泛关注&#xff0c;不仅是因为其技术创新&#xff0c;还因为潜在的隐私问题。甚至连Elon Musk也对此表示担忧&am…

Nginx企业级负载均衡:技术详解系列(11)—— 实战一机多站部署技巧

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 工作中你是否遇到过这种情况&#xff1a;公司业务拓展&#xff0c;新增一个域名&#xff0c;但服务器资源有限&#xff0c;只能跟原有的网站共用同一台Nginx服务器。 也就是说两个网站的域名都指向同一台Nginx服务器…

WPF中DataGrid实现多选框功能

1. 效果图 2. Model建立 public class RstModelCheck : ObservableObject {//为了显示Head1和Head2.而且View中绑定属性而非字段&#xff0c;否则不能显示。public string? Name { get; set; } public bool PlatenAll {get > _platenAll;set{SetProperty(ref _platenAl…

MoonDream2微调指南【最小VLM】

在本指南中&#xff0c;我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调&#xff0c;以计数项目&#xff08;这是 GPT-4V 一直表现不一致的任务&#xff09;&#xff0c;并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…

电力巡检穿戴式智能手环:让巡检不孤立无援

电力巡检穿戴式智能手环:让巡检不孤立无援 在电力巡检的广袤天地里中&#xff0c;电力工作人员他们身着工装&#xff0c;头戴安全帽&#xff0c;手持仪器&#xff0c;穿梭在高压线路与铁塔之间。他们的健康状态&#xff0c;直接关系到电力作业的安全与效率。如今&#xff0c;电…

先进电气技术 —— 控制理论中的“观测器”概述

一、背景 观测器在现代控制理论中的地位十分重要&#xff0c;它是实现系统状态估计的关键工具。观测器的发展历程可以从以下几个方面概述&#xff1a; 1. 起源与发展背景&#xff1a; 观测器的概念源于对系统状态信息的需求&#xff0c;特别是在只能获取部分或间接输出信息…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

VSCode注释模板配置(koroFileheader插件)

近期公司转远程开发&#xff0c;原本idea本地开发用得很丝滑&#xff0c;但使用idea client切换到远程开发&#xff0c;发现各种难受&#xff0c;于是只好探索新工具&#xff0c;py和cpp一直用vscode&#xff0c;于是也试试java&#xff0c;果然比idea client强不只一点点&…

小程序-滚动触底-页面列表数据无限加载

// index/index.vue <template> <!-- 自定义导航栏 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜欢 --> <Guess ref"guessRef" /> </s…

【RFID打破时尚行业货品管理困境】

时尚行业数字化转型 越来越多的快时尚品牌意识到&#xff0c;要应对市场的快速变化和消费者的多样化需求&#xff0c;构建数字化转型是服饰企业发展的必然趋势。 数智化技术成为了企业“降本增效”的关键因素&#xff0c;时尚行业供应链管理开始走向数字化、智能化。根据第一…

在kaggle中的notebook 如何自定义 cuda 版本以及如何使用自定义的conda或python版本运行项目(一)

问题 第一部分 当前kaggle中带有gpu的notebook 默认的cuda 是12.1版本&#xff0c;如果我要跑一个项目是11.3的&#xff0c;如何将默认的cuda 改为自己需要的cuda 11.3 方法 step1 从官网下载需要的版本cuda run 文件&#xff08;如cuda 11.3&#xff09; 在nvidia cuda 下…

【linux】服务器sshd服务导致CPU负载过高问题

一、背景 一台服务器突然访问ssh特别缓慢&#xff0c;top命令查看后&#xff0c;服务器Load Average占用很高。看相关异常进程都是sshd服务导致。 二、排查思路 查看服务器内存&#xff0c;磁盘io都是正常&#xff0c;在用连接数也不多。 一开始就怀疑是不是服务器被恶意攻…

20232820 2023-2024-2 《网络攻防实践》实践十一报告

20232820 2023-2024-2 《网络攻防实践》实践十一报告 1.实践内容 web浏览器渗透攻击 任务&#xff1a;使用攻击机和Windows靶机进行浏览器渗透攻击实验&#xff0c;体验网页木马构造及实施浏览器攻击的实际过程 取证分析实践—网页木马攻击场景分析 攻防对抗实践—web浏览…