Linux基础 (十):Linux 信号的使用

news2024/11/17 15:07:45

目录

一、信号的基本概念

二、信号处理常见方式概览

三、修改信号的响应方式 – signal()

3.1 简单复习结束前台进程

3.2  改变SIGINT信号的响应方式

3.3 自定义方式改变进程对信号的响应

3.4 进程对信号作出两种响应

四、发送信号 – kill()

五、利用信号解决僵死进程问题


一、信号的基本概念

       Linux 信号(signals)是一种用于进程间通信(Inter-Process Communication,IPC)的机制,允许进程通过发送和接收信号来通知其他进程某些事件的发生。信号是中断处理的一种手段,可以打断一个进程的正常执行流,迫使它处理特定的事件。与信号有关的系统调用在“signal.h”头文件中有声明 。信号是进程之间事件异步通知的一种方式,属于软中断。每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #define SIGINT 2

常用信号

在Linux中,有几种常用的信号:

  • SIGHUP (1): 挂起信号,通常用于重新加载配置文件或重启服务。
  • SIGINT (2): 中断信号,通常由Ctrl+C生成,用于中断进程。
  • SIGQUIT (3): 退出信号,由Ctrl+\生成,用于退出进程并生成核心转储文件。
  • SIGILL (4): 非法指令信号,通常由非法指令生成。
  • SIGABRT (6): 异常终止信号,通常由abort函数生成。
  • SIGFPE (8): 浮点异常信号,通常由除零或其他浮点操作错误生成。
  • SIGKILL (9): 终止信号,不能被忽略或捕获,用于强制终止进程。
  • SIGSEGV (11): 段错误信号,通常由非法内存访问生成。
  • SIGPIPE (13): 管道破裂信号,通常在向一个没有读端的管道写数据时生成。
  • SIGALRM (14): 定时器信号,通常由alarm函数生成。
  • SIGTERM (15): 终止信号,用于正常终止进程。
  • SIGUSR1 (10) 和 SIGUSR2 (12): 用户自定义信号。
  • SIGCHLD (17 )子进程结束后,会默认给父进程发送该信号

二、信号处理常见方式概览

        一个进程对于信号的响应方式可选的处理动作有以下三种:

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

signal()的两个参数 第一个是信号代号,第二个是一个函数(参数为int类型,返回值为void)  

三、修改信号的响应方式 – signal()

3.1 简单复习结束前台进程

         用户输入命令,. 用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被操作系统获取,解释成信号,发送给目标前台进程 .,前台进程因为收到信号,进而引起进程退出。

注意

  1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程 结束就可以接受新的命令,启动新的进程。
  2. Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。
  3. 前台进程在运行过程中用户随时可能按下 Ctrl-C 而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止,所以信号相对于进程的控制流程来说是异步 (Asynchronous)的。

3.2  改变SIGINT信号的响应方式

       SIGINT (2): 中断信号,通常由Ctrl+C生成,用于中断进程,用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被操作系统获取,解释成信号,发送给目标前台进程 .,前台进程因为收到信号,进而引起进程退出。这里我们利用signal()系统调用改变它的响应方式为忽略。

3.3 自定义方式改变进程对信号的响应

3.4 进程对信号作出两种响应

四、发送信号 – kill()

kill() 可以向指定的进程发送指定的信号:

五、利用信号解决僵死进程问题

         进程复制与替换一章讲过用wait函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不 能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一下,程序实现复杂。 其实,子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号 的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可

请编写一个程序完成以下功能:父进程fork出子进程,子进程调用exit(0)终止,父进程自定义SIGCHLD信号的处理函数, 在其中调用wait获得子进程的退出状态并打印。 事实上,由于UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调 用signal将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。系统默认的忽略动作和用户用signal函数自定义的忽略通常是没有区别的,但这是一个特例。此方法对于Linux可用,但不保证 在其它UNIX系统上都可用。

以上就是全部内容!请务必掌握,这是后续学习的基础,欢迎大家点赞加关注评论,您的支持是我前进最大的动力!下期再见!

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

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

相关文章

Apache CXF Aegis databinding SSRF 高危漏洞修复

一、漏洞修复 Apache CXF Aegis databinding SSRF漏洞 Spring Web UriComponentsBuilder URL解析不当漏洞 二、修复步骤 1、Apache CXF Aegis databinding SSRF漏洞修复 步骤: 进入服务器搜索 databinding find -name *databinding* 发现版本是3.1.6 果断…

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求,用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务,我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…

list的模拟实现(一)

嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(一),下面让我们开始今天的学习吧! list的模拟实现(一) 1.list splice接口的使用 2.list尾插的实现 3.list的迭代…

瑞昱半导体AMB82 MINI(RTL8735B)Arduino 方法介绍

介绍瑞昱半导体(Realtek )AMB82-Mini 物联网 AI开发板 Ameba是一个易于编程的平台,用于开发各种物联网应用程序。AMB82 MINI配备了各种外设接口,包括WiFi、BLE、GPIO INT、I2C、UART、SPI、PWM、ADC。通过这些接口,AM…

Reids高频面试题汇总总结

一、Redis基础 Redis是什么? Redis是一个开源的内存数据存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令来操作这些数据结构。Redis的主要特点是什么? 高性能:Redis将数据存储在内…

C语言代码错误(一)

今天在写选择排序代码时&#xff0c;在测试数据发现不能显示结果 1、代码如下&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的下标int buf; // 互换数据时的临时变量int n;printf("你想输入多少个数据n:\n…

ElasticSearch插件版本与ES版本不对应的解决方案

一、背景 最近需要给es安装ik、hanlp分词器和ingest-attachment管道&#xff0c;服务器已有的es版本为8.5.3&#xff08;似乎太新了&#xff09;&#xff0c;hanlp和ingest-attachment都没有这么高的版本&#xff0c;因此只能下载相对老的版本&#xff0c;然后自己修改配置文件…

C#同花顺下单 模拟操作版接口实现

C#同花顺下单 模拟操作版接口的实现 采用C#编程语言实现&#xff0c;对同花顺下单界面自动控制&#xff0c;将实现方法封装为DLL可以任意使用&#xff0c;支持几乎所有券商&#xff0c;不需要更换特定的券商。 比如当下最流行的QMT量化软件&#xff0c;仍然受限于特定的券商&a…

springboot小结1

什么是springboot ​ Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的&#xff0c;使用它可以做到专注于Spring应用的开发&#xff0c;而无需过多关注XML的配置。 ​ 简单来说&#xff0c;它提供了一堆依赖打包Starter&#xff0c;并已经按照使用习惯解决…

利用element实现简单右键

利用element-plus中的el-menu实现简单右键 实现如下 <template><main class"mainClass" contextmenu"showMenu($event)"> </main><el-menu:default-active"1"class"el-menu-demo"mode"vertical":col…

【Qt】Qt入门

思维导图 学习目标 这一系列是学习Qt&#xff0c;在C中&#xff0c;会发现有不少岗位的要求是熟悉Qt&#xff0c;所以Qt的学习是不能推迟的。 一、Qt的概述 1.1 Qt的特点 Qt是一个跨平台的C应用程序开发框架&#xff1a; 具有短平快的优秀特质&#xff1a;投资少&#xff0…

大模型额外篇章二:基于chalm3或Llama2-7b训练酒店助手模型

文章目录 一、代码部分讲解二、实际部署步骤(CHALM3训练步骤)1)注册AutoDL官网实名认证2)花费额度挑选GPU3)准备实验环境4)开始执行脚本5)从浏览器访问6)可以开始提问7)开始微调模型8)测试训练后的模型三、基于Llama2-7b的训练四、额外补充1)修改参数后2)如果需要访问…

windows安装SQL Server

1、下载 下载网页&#xff1a;SQL Server 下載 | Microsoft 2022版下载地址&#xff1a;https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下载结果&#xff1a;SQL2022-SSEI-Dev.exe 打开选第三个&#xff0c;下载介质&…

Cohere继Command-R+之后发布大模型Aya-23,性能超越 Gemma、Mistral 等,支持中文

前言 近年来&#xff0c;多语言大模型&#xff08;MLLM&#xff09;发展迅速&#xff0c;但大多数模型的性能依然存在显著差距&#xff0c;尤其是在非英语语言方面表现不佳。为了推动多语言自然语言处理技术的发展&#xff0c;Cohere团队发布了新的多语言指令微调模型家族——…

微信小程序文本框输入显示已经输入的字数

我们遇到这样的需求&#xff0c;就是微信小程序的输入框下面需要显示输入的字数&#xff1a; 我们通常会使用bindinput事件&#xff0c;让显示的字数等于value的长度&#xff0c;看下面的图&#xff1a; 但在实践中&#xff0c;真机测试中&#xff0c;我们会发现以下问题: 这个…

【C++】——入门基础知识超详解

目录 ​编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式&#xff1a; 注意事项 3. C输入&输出 示例 1&#xff1a;基本输入输出 示例 2&#xff1a;读取多个值 示例 3&#xff1a;处理字符串输入 示例 4&#xff1a;读…

2024年5月27日 十二生肖 今日运势

小运播报&#xff1a;2024年5月27日&#xff0c;星期一&#xff0c;农历四月二十 &#xff08;甲辰年己巳月辛卯日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;羊、蛇、狗 需要注意&#xff1a;鼠、鸡、龙 喜神方位&#xff1a;西南方 财神方位&#xff1a;…

vue3 vite项目配置了proxy代理情况下查看真实的接口调用地址

vite配置了proxy代理情况下如何查看真实的接口调用地址? 使用vite进行代理 在vite.config.ts配置了代理 在浏览器查看请求头和响应头发现只有代理前的url&#xff0c;没有显示代理后的路径 然后发现一个bypass函数&#xff0c;但是此函数只能修改res响应头的数据&#xff0…

指纹识别系统架构

目录 1. 系统架构 1.1 指纹采集模块 1.2 指纹处理模块 1.3 指纹登记模块 1.4 指纹识别模块 1.5 指纹识别决策模块 1.6 管理模块 1.6.1 存储管理 1.6.2 传输管理 1.6.3 安全管理 1.7 应用开放功能 1.7.1 指纹登记功能 1.7.2 指纹验证功能 1.7.3 指纹辨识功能 2. …

DM Hw6

Hw6 聚类 1ab 2abcd 3abcde 456789 1 a b 一个点不来自某个特定簇的概率是 1 − 1 K 1-\frac{1}{K} 1−K1​ 对所有 2 K 2K 2K 个点都不来自该簇的概率是 ( 1 − 1 K ) 2 K (1-\frac{1}{K})^{2K} (1−K1​)2K 则 至少一个点来自该簇的概率为 1 − ( 1 − 1 K ) 2 K 1-(1-…