Linux应用:Linux的信号

什么是信号

信号是一种软件中断,用于通知进程系统中发生了某种特定事件。它是操作系统与进程之间,以及进程与进程之间进行异步通信的一种方式。在 Linux 系统中,信号是一种比较简单的进程间通信机制。当一个信号产生时,内核会通过某种方式通知相应的进程,进程接收到信号后,会根据信号的类型以及自身对该信号的处理方式来做出响应。例如,用户按下 Ctrl + C 组合键,系统会向当前前台进程发送一个 SIGINT 信号,通常情况下,进程接收到这个信号后会终止运行。

常见的信号

SIGINT

SIGINT:中断信号,通常由用户按下 Ctrl + C 组合键产生。它用于通知进程需要立即停止当前操作并退出。许多交互式程序,如命令行工具,在接收到 SIGINT 信号时会停止运行,清理资源并退出。​
SIGTERM:终止信号。这是一个通用的终止信号,系统或其他进程可以发送给目标进程,请求其正常终止。与 SIGKILL 不同,SIGTERM 允许进程有机会在终止前进行清理操作,例如关闭打开的文件、释放内存等。许多服务器程序在接收到 SIGTERM 信号时,会停止接受新的连接,并逐步关闭当前正在处理的连接,然后安全退出。​

SIGKILL

SIGKILL:强制终止信号。一旦进程接收到 SIGKILL 信号,内核会立即终止该进程,进程没有机会进行任何清理操作。这个信号主要用于处理那些陷入死锁或无法响应其他正常终止信号的进程。但由于它不允许进程进行清理,可能会导致资源没有正确释放等问题,所以一般作为最后的手段使用。​

SIGALRM

SIGALRM:闹钟信号。进程可以使用 alarm 函数设置一个定时器,当定时器超时后,内核会向该进程发送 SIGALRM 信号。常用于实现定时任务,比如在一个网络请求中设置超时时间,如果在规定时间内没有得到响应,进程接收到 SIGALRM 信号后可以进行相应的错误处理。​

SIGCHLD

SIGCHLD:子进程状态改变信号。当一个进程的子进程终止、暂停或继续运行时,内核会向该父进程发送 SIGCHLD 信号。父进程可以通过处理这个信号来回收子进程的资源,避免产生僵尸进程。

进程怎么处理信号

默认处理

默认处理:每个信号都有系统默认的处理方式。例如,对于 SIGINT 信号,默认处理方式是终止进程;对于 SIGQUIT 信号,默认处理方式是终止进程并生成核心转储文件(如果允许的话)。进程在没有对某个信号进行自定义处理时,就会按照系统默认方式来响应信号。

忽略信号​

忽略信号:进程可以选择忽略某些信号,即接收到信号后不进行任何操作。但并不是所有信号都可以被忽略,例如 SIGKILL 和 SIGSTOP 信号不能被忽略,这是为了保证系统能够在必要时强制终止或暂停进程。一般情况下,进程可以通过调用 signal 函数来设置对某个信号的处理方式为忽略,例如signal(SIGINT, SIG_IGN); 这行代码会使进程忽略 SIGINT 信号,当用户按下 Ctrl + C 时,进程不会终止。​

捕获信号并自定义处理

捕获信号并自定义处理:进程可以定义一个信号处理函数,当接收到特定信号时,内核会调用该函数,进程在函数中可以执行自定义的操作。首先需要定义信号处理函数,

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>int fd;
int* ptr;void sigint_handler(int signum) {printf("Received SIGINT. Cleaning up...\n");if (fd != -1) {close(fd);printf("File test.txt closed.\n");}if (ptr != NULL) {free(ptr);printf("Memory freed.\n");}exit(0);
}int main() {signal(SIGINT, sigint_handler);fd = open("test.txt", O_RDONLY);ptr = (int*)malloc(sizeof(int));while(1) {printf("Main process is working...\n");sleep(1);}return 0;
}

stdio.h:提供标准输入输出库函数,如 printf 用于输出信息。
signal.h:用于信号处理相关的函数和宏定义,这里会用到 signal 函数来设置信号处理程序。
unistd.h:包含了许多 Unix 标准库函数,例如 close 用于关闭文件描述符,sleep 用于使程序暂停执行。
fcntl.h:提供文件控制操作的函数和宏定义,代码中使用 open 函数来打开文件。
stdlib.h:包含通用工具函数,例如 malloc 用于动态分配内存,free 用于释放动态分配的内存,exit 用于终止程序。
fd:用于存储文件描述符,后续会通过 open 函数打开文件并将返回的文件描述符赋值给它。
ptr:是一个指向 int 类型的指针,用于存储动态分配的内存地址。
sigint_handler:这是一个信号处理函数,当进程接收到 SIGINT 信号时会被调用。
signum:是传递给信号处理函数的信号编号,在这个函数中,signum 的值为 SIGINT。
函数内部操作:
打印一条消息,表示接收到了 SIGINT 信号,开始进行清理工作。
检查 fd 是否有效(不等于 -1),如果有效则关闭文件并打印关闭文件的信息。
检查 ptr 是否为空指针,如果不为空则释放动态分配的内存并打印释放内存的信息。
调用 exit(0) 终止程序,返回状态码 0 表示正常退出。
signal(SIGINT, sigint_handler):将 SIGINT 信号的处理函数设置为 sigint_handler,这样当进程接收到 SIGINT 信号(通常是用户按下 Ctrl+C)时,会调用 sigint_handler 函数进行处理。
fd = open(“test.txt”, O_RDONLY);:以只读模式打开 test.txt 文件,并将返回的文件描述符赋值给 fd。
ptr = (int*)malloc(sizeof(int));:动态分配一个 int 类型大小的内存空间,并将其地址赋值给 ptr。
while(1):创建一个无限循环,模拟主程序持续执行任务。
printf(“Main process is working…\n”);:每秒打印一条消息,表示主程序正在运行。
sleep(1);:使程序暂停执行 1 秒,避免消息打印过快。
代码通过设置信号处理函数,确保在程序运行过程中接收到 SIGINT 信号时,能够正确地关闭打开的文件并释放动态分配的内存,然后正常终止程序,避免资源泄漏。
在这里插入图片描述

alarm 和pause函数

alarm 函数:alarm 函数用于设置一个定时器,在指定的秒数后,内核会向调用该函数的进程发送 SIGALRM 信号。函数原型为unsigned int alarm(unsigned int seconds);,参数 seconds 表示定时器的超时时间,单位为秒。如果在调用 alarm 函数时,之前已经设置过定时器且尚未超时,那么之前设置的定时器将被新的定时器覆盖,并且返回值是之前定时器剩余的时间。如果 seconds 为 0,则取消之前设置的定时器,并且返回值为之前定时器剩余的时间(如果之前没有设置定时器,则返回 0)。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>void sigalrm_handler(int signum) {printf("Time's up!\n");
}int main() {signal(SIGALRM, sigalrm_handler);alarm(5); // 设置5秒后发送SIGALRM信号while(1) {// 主程序执行其他任务sleep(1);printf("Working...\n");}return 0;
}

设置了一个 5 秒的定时器,5 秒后进程接收到 SIGALRM 信号,会调用 sigalrm_handler 函数输出 “Time’s up!”。
在这里插入图片描述

pause 函数:pause 函数用于使调用它的进程暂停执行,直到该进程接收到一个信号。函数原型为int pause(void);。如果进程接收到的信号的处理方式是默认处理或忽略,那么 pause 函数返回后,进程会继续执行 pause 函数后面的代码;如果进程接收到的信号的处理方式是捕获信号并执行自定义处理函数,那么在自定义处理函数执行完毕后,pause 函数返回,进程继续执行 pause 函数后面的代码。pause 函数的返回值总是 - 1,并且会设置 errno 为 EINTR,表示被信号中断。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>void sigalrm_handler(int signum) {printf("Time's up!\n");
}int main() {signal(SIGALRM, sigalrm_handler);alarm(5); // 设置5秒后发送SIGALRM信号while(1) {// 主程序执行其他任务sleep(1);printf("Working...\n");}return 0;
}

进程执行到 pause 函数时会暂停,当用户按下 Ctrl + C 发送 SIGINT 信号后,进程调用 sigint_handler 函数,然后 pause 函数返回,进程继续执行输出 “After pause”。
在这里插入图片描述

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

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

相关文章

Linux笔记之Ubuntu22.04安装IBus中文输入法教程

Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review&#xff01; 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …

【AIGC前沿】MiniMax海螺AI视频——图片/文本生成高质量视频

目录 1.MiniMax海螺AI视频简介 2.使用教程 1.MiniMax海螺AI视频简介 海螺视频&#xff0c;作为 MiniMax 旗下海螺 AI 平台精心打造的 AI 视频生成工具&#xff0c;致力于助力用户产出高品质视频内容。该工具依托 abab-video-1 模型&#xff0c;具备强大的文生视频功能。用户…

Kubeasz工具快速部署K8Sv1.27版本集群(二进制方式)

文章目录 一、基本信息二、服务器初始化操作三、使用Kubeasz部署K8S集群四、验证集群 一、基本信息 1、部署需要满足前提条件&#xff1a; 注意1&#xff1a;确保各节点时区设置一致、时间同步&#xff1b;注意2&#xff1a;确保在干净的系统上开始安装&#xff1b;注意3&…

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像&#xff0c;下面例举清华网站 清华镜像站点&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xff0c…

2025年Postman的五大替代工具

虽然Postman是一个广泛使用的API测试工具&#xff0c;但许多用户在使用过程中会遇到各种限制和不便。因此&#xff0c;可能需要探索替代解决方案。本文介绍了10款强大的替代工具&#xff0c;它们能够有效替代Postman&#xff0c;成为你API测试工具箱的一部分。 什么是Postman&…

wow-rag—task5:流式部署

我们希望做一个流式输出的后端&#xff0c;然后让前端去捕获这个流式输出&#xff0c;并且在聊天界面中流式输出。 首先构造流式输出引擎。 # 构造流式输出引擎 query_engine index.as_query_engine(streamingTrue, similarity_top_k3,llmllm)然后生成response_stream&#x…

投资日记_道氏理论技术分析

主要用于我自己参考&#xff0c;我感觉我做事情的时候容易上头&#xff0c;忘掉很多事情。 技术分析有很多方法&#xff0c;但是我个人相信并实践的还是以道氏理论为根本的方法。方法千千万万只有适合自己价值观&#xff0c;习惯&#xff0c;情绪&#xff0c;性格的方法才是好的…

LangChain4j入门指南:Java开发者的AI应用新起点

什么是LangChain和LangChain4j&#xff1f; LangChain是⼀个⼤模型的开发框架&#xff0c;使⽤ LangChain 框架&#xff0c;程序员可以更好的利⽤⼤模型的能⼒&#xff0c;⼤⼤提⾼编 程效率。如果你是⼀个 Java 程序员&#xff0c;那么对 LangChain 最简单直观的理解就是&…

【实测闭坑】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库

LazyGraphRAG 2024年4月&#xff0c;为解决传统RAG在全局性的查询总结任务上表现不佳&#xff0c;微软多部门联合提出Project GraphRAG&#xff08;大模型驱动的KG&#xff09;&#xff1b;2024年7月&#xff0c;微软正式开源GraphRAG项目&#xff0c;引起极大关注&#xff0c…

压力测试实战指南:JMeter 5.x深度解析与QPS/TPS性能优化

一、压力测试基础概念 1.1 什么是压力测试&#xff1f; 定义&#xff1a;模拟极端负载场景验证系统性能极限 目的&#xff1a;发现性能瓶颈、评估系统可靠性、验证容错能力 常见类型&#xff1a;负载测试、压力测试、稳定性测试、峰值测试 1.2 核心性能指标解析 1.2.1 QP…

嵌入式4-Modbus

1.Modbus Modbus 是一种广泛应用于工业自动化领域的通信协议&#xff0c;用于在不同设备&#xff08;如传感器、PLC、变频器、仪表等&#xff09;之间交换数据。它支持串行通信&#xff08;如 RS232、RS485&#xff09;和以太网通信&#xff08;Modbus TCP&#xff09;&#x…

机器学习-手搓KNN算法

一、简介 K最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;​ 是一种简单且直观的监督学习算法&#xff0c;适用于分类和回归任务。其核心思想是&#xff1a;​相似的数据点在特征空间中彼此接近。KNN通过计算新样本与训练数据中各个样本的距离&#xff0c;找到最近的…

Linux|fork命令及其使用的写时拷贝技术

fork复制进程 fork通过以下步骤来复制进程&#xff1a; 分配新的进程控制块&#xff1a;内核为新进程分配一个新的进程控制块&#xff08;PCB&#xff09;&#xff0c;用于存储进程的相关信息&#xff0c;如进程 ID、状态、寄存器值、内存指针等。复制进程地址空间&#xff1…

Hoppscotch 开源API 开发工具

Hoppscotch 是一个开源的 API 开发工具&#xff0c;旨在为开发者提供一个轻量级、快速且功能丰富的 API 开发和调试平台。以下是对其主要特性和功能的详细介绍&#xff1a; 1. 轻量级与高效 Hoppscotch 采用简约的 UI 设计&#xff0c;注重易用性和高效性。它支持实时发送请求…

Datawhale大语言模型-Transformer以及模型详细配置

Datawhale大语言模型-Transformer以及模型详细配置 Transformer模型位置编码前馈层网络注意力机制多头自注意力编码器解码器 大语言模型的参数配置归一化激活函数位置编码旋转位置编码代码内容实现 注意力机制 参考资料 Transformer模型 当前主流的大语言模型都基于 Transform…

iPhone 16怎么编辑图片?图片编辑技巧、软件分享

在当今这个视觉信息爆炸的时代&#xff0c;一张经过精心编辑的图片往往能够瞬间抓住观众的眼球&#xff0c;而 iPhone 16凭借其卓越的硬件性能和丰富的软件生态&#xff0c;在图片编辑领域展现出了非凡的实力&#xff0c;成为众多摄影爱好者和创意工作者的得力助手。 一、编辑效…

代码随想录_动态规划

代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n…

【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法

虚幻引擎版本&#xff1a;5.5.4 问题描述 刚创建的Third Person项目里&#xff0c;定义一个BP_Enemy蓝图&#xff0c;拖拽到场景中产生的实例会追随玩家&#xff0c;但SpawnActor产生的实例会固定不动。BP_Enemy蓝图具体设计如下&#xff1a; BP_Enemy的Event Graph ​​ 又定义…

论文笔记(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理问答&#xff08;ERQA&#xff09;基准测试2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零样本和少样本机器人控制 3. 使用 Gemini Robotics 执行机器人动作3…

汇能感知高品质的多光谱相机VSC02UA

VSC02UA概要 VSC02UA是一款高品质的200万像素的光谱相机&#xff0c;适用于工业检测、农业、医疗等领域。VSC02UA 包含 1600 行1200 列有源像素阵列、片上 10 位 ADC 和图像信号处理器。它带有 USB2.0 接口&#xff0c;配合专门的电脑上位机软件使用&#xff0c;可进行图像采集…