Linux——信号(1)信号的产生

我们在讲进程的多种状态时提到过,一个进程的退出有三种情况:正常退出,结果出错退出(代码也执行完了),异常终止退出(代码未执行完),其中最后一种退出相当于进程在运行时,突然收到某个”消息“,使自己不得不终止运行,这种”消息“就是信号。本文我们主要讲到什么是信号、产生的方式以及应用情景等。

一、什么是信号

在生活中,我们也会有很多信号,比如下课铃响了我们知道下课了,绿灯来了我们知道该走了,也就是说,它们在向我们发出某种消息,使得我们去做一些事情,在操作系统中也类似,信号就是其他进程,向目标进程发送异步事件的一种方式。所谓异步,就是指目标进程自己也不知道这个信号什么时候来,突然、随时的情况。

二、关于信号你需要知道的一些知识

1.我们如何识别信号呢?

识别信号是内置的。进程认识信号,是程序内置的特性。就相当于我们从小就被告知红灯停绿灯行

2.信号产生后该如何处理知道吗?如果没有产生,信号又该如何处理知道吗?

全都知道!因为信号处理的方法,在信号产生之前,就已经准备好了,就像我们从来没遇见红绿灯时,家长告诉我们如果遇到了应该这样做。

3.信号来的时候,我需要立即处理吗?

不一定,因为此时我正在做的事情优先级比较高,可能在某个合适的时候再进行处理。但进程需要把信号记录下来。

4.如何处理信号?

a.默认行为(我们早就被告知正常应如何做)

b.忽略信号(并不是不处理,而是遇见信号后对其完成忽略操作,比如闹钟响了我把它关闭并设置成一小时后再响)

c.自定义行为 (我虽然是被告知如果遇见信号该如何做,但是我也可以不听它的,按照自己的想法去做)

三、信号的产生方式

1. 键盘产生

我们知道,在Linux中想执行一个程序只需要输入 ./name即可,这种方式我们称前台进程。对应的还有后台进程(程序在后台运行)语法为 ./name &。二者的区别是:前台进程相当于把命令行解释占用了,当进程运行时,我们无法进行输入操作来完成某些命令,而后台进程运行时,我们依旧可以进行命令行解释(后台进程也可以把内容打印在显示器上)。我们之前提到的热键Ctrl+C,其实是终止前台进程的命令。至于如何终止后台命令,a.我们可以再打开一个终端然后找到进程的pid进行kill操作 b.我们在使用./name &时,它会显示一个下标和pid,我们只需要使用命令fg 下标(比如fg 1)即可把对应下标的进程放置前台运行,然后再ctrl+c。我们输入ctrl+c时,实质上是把某种信号给了前台进程,使其终止。至于信号的捕捉,我们有系统调用

其就是把指定的信号(参数1)按照自定义的方式(参数2)去捕捉

其中我们第二个参数要传函数的地址。函数的类型是void且参数是int(输出型参数,会用信号的序号赋值)

查看所有的信号我们用命令:kill -l

其中,我们的ctrl+c传给进程的就是2号信号(每一个信号名称都是宏)与此功能类似的是3号信号,默认也是终止,热键是ctrl+\ (我们只重点讲1-31号)

在1-31号中,大部分都是和进程终止相关的信号,且基本都能被signal捕捉,但有一个信号是绝对不可能被捕捉的——9号,它也是杀掉进程的信号,我们常与kill命令结合终止命令。

关于signal有两点补充:
(1)对于同一个信号,signal捕捉一次即可,不必放在循环中

  (2)   若没有产生某种信号,signal中的handler一般不会被调用

言归正传,我们从键盘输入是如何转化成信号的?过程是,我们从键盘输入的内容,先是交给了OS,然后OS再把我们的内容转化为对应的信号传递给进程,但我们说过,进程并不是收到信号立马就处理,有时候也需要记录信号,那么进程记录信号的方式是:在PCB中创建一个位图(记录1-31号,比特位的位置为信号的编号,比特位是否为1表示是否收到对应的信号,所以,发送信号的本质是写入信号,即OS修改该进程PCB中的位图。

那么OS怎么知道键盘上有数据了?

我们引进一个名词——硬件中断,根据冯诺依曼体系,我们的键盘属于输入设备,按道理来讲OS会不断地检测键盘是否有内容输入,但现在不用了,当键盘输入完毕的时候,会向OS发出硬件中断的信号,OS收到信号再来获取数据。

2.指令中断

关于中断进程的指令,我们刚才也提到过,也就是kill

kill -num pid

3.系统调用

没错,kill也是系统调用,返回值小于0表示发送信号失败

除此之外,还有一个系统调用——raise

它的特点是,把你要传的信号序号进行传参,然后谁调用这个系统调用就把这个信号传给谁。

还有不传参版的——abort

4.软件条件

在OS中因某些软件还没准备好,或不具备某种条件而产生的信号方式就是软件条件。比如我们之前提到的管道,当管道的读端关闭写端仍要写入,操作系统就会发送信号(13号)杀死这个进程,这就是软件条件不具备。除此之外还有一个例子——闹钟

可以设定我们的进程在多长时间后自动终止。即到指定时间后由OS向进程发送指定信号(14)

至于其返回值,当alarm传参为0时,表示取消闹钟,此时返回值就是上一个闹钟的剩余时间。

5.异常 

进程出现异常的情形大多数是因为野指针、除0操作,当进程出现异常了,OS会向进程发送8//11信号来杀死进程。

四、core与term

我们查信号手册时,发现有的进程是core有的是term,他们有什么区别呢?

term类型是正常终止进程,而core类型比它多做了一件事——核心转储

当进程收到信号要终止时,会在当前目录下形成文件->pid.core,当进程崩溃时,会把进程在内存的信息保存起来,方便后续调试。但云服务器一般是关闭core的这个功能的。

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

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

相关文章

LeetCode 2919 使数组变美的最小增量运算数

动态规划解题:最小操作次数使数组变为美丽数组 问题描述 给定一个下标从0开始、长度为n的整数数组nums和一个整数k。你可以对数组中的任意一个元素进行加1操作,操作次数不限。如果数组中任意长度大于或等于3的子数组的最大值都大于或等于k,…

计算生物学在中国的发展情况?

李升伟 整理 计算生物学在中国的发展呈现出多方面积极态势,具体表现如下: 发展概述: 上海发布了医用AI发展的专项方案,特别强调了脑科学与计算生物学的前沿领域。这表明政府有意推动该领域的技术进步和技术合作平台建设。国内的…

Linux之文件内容显示(cat、grep、cut、sort、uniq、tr)

🎯 本文专栏:Linux 🚀 作者主页:小度爱学习 1、浏览普通文件内容 命令常用选项说明cat-n 对输出内容中的所有行标注行号;-b 对输出内容中的非空行标注行号。查看文本文件的内容head-num 指定需要显示文件num行的内容。…

3DS 转 STL 全攻略:传统工具与迪威模型网在线转换深度解析

在 3D 建模与 3D 打印的技术领域中,常常会遇到需要将不同格式的文件进行转换的情况。其中,把 3DS 文件转换为 STL 格式是较为常见的操作。3DS 文件作为一种旧版 Autodesk 3D Studio 使用的 3D 图像格式,存储着丰富的信息,包括网格…

IoT FEM射频前端模组芯片(2.4G PA)三伍微电子GSR2401 兼容替代RFX2401

型号:GSR2401应用:适用于蓝牙(BT)、ZigBee及物联网(IoT)设备 功能:集成了功率放大器(PA)、开关(Switch)和低噪声放大器(LNA&#xff…

Missashe考研日记-day22

Missashe考研日记-day22 1 专业课408 学习时间:3h学习内容: 先把昨天关于进程调度的课后习题做了,然后花了挺长时间预习OS的最最最最重要的一部分——同步与互斥问题,这部分大二上课的时候就懵懵懂懂的,得认真再领悟…

2025年最新Web安全(面试题)

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

Qt QML - qmldir使用方法详解

以实际例子看qmldir的使用 1.搞一个qmldir2.让QML找到你的qmldir (重点).pro 工程文件QQmlApplicationEngine加载主QML处 3.用起来你的模块 qmldir是Qt QML模块化的基石,其设计初衷是为解决QML文件的组织、复用和依赖管理问题,。只需要在每个…

# Shell脚本参数设计规范(DeepSeek指导)

Shell脚本参数设计规范(DeepSeek指导) 文章目录 Shell脚本参数设计规范(DeepSeek指导)A 我问:Q DeepSeek回答:**命令行参数表示规范****标准化表示示例**情况1:必选选项参数值情况2:…

MQTT协议:IoT通信的轻量级选手

文章总结(帮你们节约时间) MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP,其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…

数据结构——反射、枚举以及lambda表达式

1. 反射 Java的反射(reflection)机制是在运⾏时检查、访问和修改类、接⼝、字段和⽅法的机制;这种动态获取信息以及动态调⽤对象⽅法的功能称为java语⾔的反射(reflection)机制。 用途 1. 框架开发 2. 注解处理 3.…

C语言教程(十):C 语言函数详解

一、引言 在 C 语言中,函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数,不仅能提高代码的可读性、可维护性,还便于代码的复用。无论是简单的数学计算,还是复杂的系统操作,函数都发挥着核心作用。…

力扣面试150题--有效的字母异位词和字母异位词分组

Day 24 题目描述 思路 初次思路:如果两个字符串为异位词,说明它们长度相同并且字母出现的次数相同,于是有以下做法: 定义一个map,来保存s中每个字符的出现次数处理特殊情况,如果长度不同,直接…

数理逻辑(Mathematical Logic)综论与跨学科应用

李升伟 整理 数理逻辑(Mathematical Logic)是现代逻辑学与数学交叉的核心学科,以严格的数学方法研究逻辑推理的形式与规律。其发展深刻影响了数学基础、计算机科学、语言哲学等领域。以下从多个维度综论数理逻辑: 1. 核心分支 命…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里? 3.1r…

泛型算法——只读算法(一)

在 C 标准库中,泛型算法的“只读算法”指那些 不会改变它们所操作的容器中的元素,仅用于访问或获取信息的算法,例如查找、计数、遍历等操作。 accumulate std::accumulate()是 C 标准库**numeric**头文件中提供的算法,用于对序列…

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …

健康养生:开启活力生活的密钥

当我们在健身房看到年逾六旬却身形矫健的老人,在公园偶遇精神矍铄、步伐轻快的长者,总会惊叹于他们的健康状态。其实,这些都得益于长期坚持科学的养生之道。健康养生并非遥不可及的玄学,而是融入生活细节的智慧。​ 在饮食的世界…

Linux信号三部曲:产生机制、处理方式与内核接口

Linux系列 文章目录 Linux系列前言一、背景知识铺垫1.1 信号的基本概念1.2 进程对信号的处理 二、信号的产生2.1 前台进程和后台进程2.2 键盘组合键2.3 kill 命令2.4 系统调用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 总结 前言 Linux中&#x…

win7/win10/macos如何切换DNS,提升网络稳定性

本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系统切换DNS,以提升系统的稳定性,获得更好的操作体验。 Windows10及Windows8.1 1、右键单击“此计算机”,然后选择“属性”。进入Windows系统界面后,选择左侧的“…