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就是正常的直接退出

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

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

相关文章

一文详解SaaS增长模式:PLG、MLG、SLG哪种更适合你?

在SaaS&#xff08;软件即服务&#xff09;的领域中&#xff0c;增长策略的选择对于企业的成功至关重要。其中&#xff0c;PLG&#xff08;产品驱动增长&#xff09;、MLG&#xff08;市场驱动增长&#xff09;和SLG&#xff08;销售驱动增长&#xff09;是三种常见的策略&…

Wireshark简介

Wireshark是一款流行的网络协议分析工具&#xff0c;可以捕获和显示网络上传输的数据包的详细信息。以下是Wireshark的基本使用方法&#xff1a; 安装Wireshark 访问Wireshark的官方网站下载适用于您操作系统的版本。按照安装向导完成安装。 打开Wireshark 启动Wireshark程…

Centos 7 安装刻录至服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

强悍!轻量级 Viedo Download 项目!!【送源码】

今天给大家分享一个非常轻量实用的命令行视频下载项目&#xff1a;Lux。 项目简介 Lux是一款基于Golang编写的快速、简单的视频下载库和命令行工具&#xff0c;支持众多个流行的视频网站&#xff0c;包括 YouTube、Bilibili、优酷、爱奇艺、腾讯视频、抖音快手等。 界面简洁易…

Spring Aop 实现对mapper层入参进行重新赋值

需求描述&#xff1a; 需要对mapper查询的入参的某个属性值进行特殊处理后查询 不影响原来业务且方便扩展维护 1&#xff0c;自定义注解 import java.lang.annotation.*;/*** 针对 mapper层入参 按照一定规则进行特殊处理重新赋值*/ Target(ElementType.METHOD) Retention(Ret…

整理好了!2024年最常见 20 道 Redis面试题(十)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Redis面试题&#xff08;九&#xff09;-CSDN博客 十九、Redis 的监控和性能评估工具有哪些&#xff1f; Redis 的监控和性能评估工具主要包括以下几种&#xff1a; redis-benchmark 性能测试工具&#xff1a;…

cs与msf权限传递,以及mimikatz抓取win2012明文密码

CS与MSF权限传递 在进行渗透测试时&#xff0c;CS&#xff08;Cobalt Strike&#xff09;和MSF&#xff08;Metasploit Framework&#xff09;是两种常用的工具。它们之间的权限传递通常涉及到在目标系统上建立后门&#xff0c;然后将控制权从一个工具转移到另一个工具。具体的…

重生之 SpringBoot3 入门保姆级学习(07、整合 Redis 案例)

重生之 SpringBoot3 入门保姆级学习&#xff08;07、整合 Redis 案例&#xff09; 导入 Maven 依赖并刷新 Maven <dependencies><!--springboot3 Web 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

高效至臻,Media Encoder 2024 for Mac——您的专业媒体处理首选

Media Encoder 2024 for Mac是一款专为Mac用户打造的专业视频和音频编码工具&#xff0c;凭借其卓越的编码能力和智能编辑功能&#xff0c;为用户提供了前所未有的媒体处理体验。无论是高清、4K还是8K的视频文件&#xff0c;Media Encoder 2024都能轻松驾驭&#xff0c;确保在压…

学习javascript的函数

1.什么是函数&#xff1f; 可以重复被使用的代码块 作用&#xff1a;函数可以把具有相同或者相似逻辑的代码“包裹起来”&#xff0c;有利于代码的复用。 2.函数的基本使用 1.定义函数 利用关键字Function 定义函数&#xff08;声明函数&#xff09; function 函数名(){函…

4、xss-labs之level4、lecel5

一、level4 1、测试分析 level4跟之前的3一样的思路&#xff0c;闭合value的值&#xff0c;但是通过双引号闭合&#xff0c;然后使用onclick的属性弹窗绕过 输入3的payload&#xff1a; 2、所以构造payload payload&#xff1a;"οnclickalert(1)// 二、level5 1、测…

uniapp高校二手书交易商城回收系统 微信小程序python+java+node.js+php

每年因为有大量的学生在接受教育&#xff0c;每到大学毕业季的时候&#xff0c;所使用的大量书籍对他们自己来说&#xff0c;很多是没有用&#xff0c;同时由于书籍多和不方便携带&#xff0c;导致很多大学生在毕业时将教材直接丢弃是在校大学生处理已用教材的一种主要方式。然…

数据结构-二叉树系统性学习(四万字精讲拿捏)

前言 这里我会从二叉树的概念开始讲解&#xff0c;其次涉及到概念结构&#xff0c;以及堆的实现和堆排序。 目的是&#xff0c;堆比二叉树简单&#xff0c;同时堆本质上是二叉树的其中一种情况&#xff0c;堆属于二叉树顺序结构的实现 最后完善二叉树的讲解&#xff0c;也就是…

敏捷开发最佳实践:需求管理实践案例之需求层次与流动

在上一期的最佳实践中&#xff0c;我们分享了需求管理实践——业务驱动开发&#xff0c;为“如何从被动接收大量无效需求&#xff0c;到主动获取需求并最终实现整体获益&#xff1f;”这一问题提供了解决思路。本期实践我们继续分享需求管理领域的最佳实践——“需求层次与流动…

Java与Gradle 的版本兼容性矩阵验证

1.下面这个表格显示了java和gradle的版本兼容性情况 2.根据上面这份表格理解&#xff0c;是不是java17就需要gradle 7.3之后来支持。用android studio 来试验一下: jdk选择: build成功: 说明JDK17并不是一定需要Gradle 7.3之后版本 3.使用JDK1.8、JDK11验证一下Grade 7.2是否可…

四款开源电子表格组件,轻松集成到你的项目

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;最近在研究在线电子表格的技术实现&#xff0c;发现了几个优质的开源电子表格项目&#xff0c;这里和大家一起分享一下。 同时我也把其中一款…

influxdb 导出查询数据为csv格式

导出csv格式 influx -username USERNAME -password PASSWORD -precision s -database DB_NAME -execute "select * from "field1","field2","field3" where time >2024-03-01 00:00:00 AND time <2024-04-01 00:00:00 tz(Asia/Shang…

【夏之以寒-Kafka面试 01】每日一练:10道常见的kafka面试题以及详细答案

作者名称&#xff1a;夏之以寒 作者简介&#xff1a;专注于Java和大数据领域&#xff0c;致力于探索技术的边界&#xff0c;分享前沿的实践和洞见 文章专栏&#xff1a;夏之以寒-kafka专栏 专栏介绍&#xff1a;本专栏旨在以浅显易懂的方式介绍Kafka的基本概念、核心组件和使用…

排序题目:最小绝对差

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;最小绝对差 出处&#xff1a;1200. 最小绝对差 难度 2 级 题目描述 要求 给定整数数组 arr \texttt{arr} arr&#xff0c;其中每个元素都不相同&…

太速科技-基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡)

基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡) 1、板卡概述   板卡采用xilinx Spartan6系列芯片&#xff0c;支持 PCI Express Base Specification 1.1 x1。内含丰富的逻辑资源和存储单元&#xff0c;板卡FPGA外接双片32M*16bit DDR2缓存器&#xff0c;支持乒乓操作。…