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.mzph.cn/web/72845.shtml

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

相关文章

实时监控、数据分析!Web-Check构建你的网站健康检测系统实操方案

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 在数字化运维领域&#xff0c;网站稳定性保障始终是开发者和运维团队的核…

win32汇编环境,网络编程入门之八

;在上一教程里&#xff0c;我们学习了简单的处理服务器返回的数据 ;在这一教程里&#xff0c;我们了解一下&#xff0c;当连接上网站后&#xff0c;应该发送什么数据过去的问题 ;这里有个简单的方式学习&#xff0c;以下是一个示例 ;我们上网的时候可以用谷歌浏览器&#xff0c…

windows 平台编译openssl

文章目录 准备环境安装perl安装NASM获取源码 源码编译配置编译 准备环境 安装perl 下载Perl 5.40.0.1 Portable zip strawberryperl 解压后设置系统环境变量 测试安装是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…

一文了解ThreadLocal

什么是ThreadLocal&#xff1f; ThreadLocal是每个线程私有的&#xff0c;线程可以把自己的私有数据放到ThreadLocal里面&#xff0c;不用担心其他线程访问到自己ThreadLocal。 通过set()方法将值存入ThreadLocal或者修改值&#xff0c;get()方法取出值&#xff0c;remove()方…

OpenWrt开发第6篇:怎么添加OpenWrt的Package-基于Raspberry Pi 4B开发板

文/指尖动听知识库-谷谷 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:Openwrt开发-基于Raspberry Pi 4B开发板 1.如图1所示,首先创建软件包所在的目录,在openwrt根目录中执行mkdir -p package/mypackages/helloworld命令;

常⻅CMS漏洞之一:WordPress

WordPress是⼀个以PHP和MySQL为平台的⾃由开源的博客软件和内容管理系统。WordPress具有插件架构和模板系统。截⾄2018年4⽉&#xff0c;排名前1000万的⽹站中超过30.6%使⽤WordPress。 WordPress是最受欢迎的⽹站 内容管理系统。全球有⼤约30%的⽹站(7亿5000个)都是使⽤WordP…

【第17节】windows sdk编程:线程与线程调度

目录 一、线程 1.1 线程的基本概念 1.2 何时创建线程 二、线程控制 三、遍历线程 四、线程内核对象 4.1 线程上下文 4.2 暂停次数 4.3 信号 五、线程调度 5.1 什么是线程优先级 5.2 进程优先级与相对线程优先级 5.3 编程改变优先级 5.4 动态优先级的概念 一、线程…

Python数据可视化实战:从基础图表到高级分析

Python数据可视化实战&#xff1a;从基础图表到高级分析 数据可视化是数据分析的重要环节&#xff0c;通过直观的图表可以快速洞察数据规律。本文将通过5个实际案例&#xff0c;手把手教你使用Python的Matplotlib库完成各类数据可视化任务&#xff0c;涵盖条形图、堆积面积图、…

【机器学习-分类算法】

比如将一张图片按尺寸识别分类为横向或者纵向两类就是二分类问题 设x轴为图像的宽、y轴为图像的高&#xff0c;那么把训练数据展现在图上就是这样的: 若增加更多的数据集有: 如果只用一条线将图中白色的点和黑色的点分开,那么: 分类的目的就是找到这条线,就可以根据点在线…

Compose Indication:点击效果设置

Compose Indication&#xff1a;打造独特点击效果的秘密武器 在Compose开发中&#xff0c;大家可能都碰到过Indication&#xff0c;不少人第一次接触它&#xff0c;是在想去掉Material默认的点击水波纹效果的时候。要是在AI工具里搜“怎么去掉水波纹效果”&#xff0c;会得到这…

Docker build 会在本地产生巨大的文件

Docker build 会在本地产生巨大的文件&#xff0c; 比如 用 这个命令列出本地镜像 docker images 可见size都是很大的&#xff0c; 到docker目录下&#xff0c;看到ext4.vhdx的大小 80多G 那只能用这个命令把不用的镜像删掉了&#xff1a; &#xff08;rmi后面是镜像id&a…

台式机电脑组装---电脑机箱与主板接线

台式机电脑组装—电脑机箱与主板接线 1、机箱连接主板的跳线一般主要有USB 2.0、USB 3.0、前置音频接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四个主板跳线&#xff0c;这些跳线分别的含义如下。 RESET SW&#xff1a;机箱重启按键&#xff1b;注&#xff1a…

【虚幻引擎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 ​​ 又定义…

跨平台RTSP高性能实时播放器实现思路

跨平台RTSP高性能实时播放器实现思路 目标&#xff1a;局域网100ms以内超低延迟 一、引言 现有播放器&#xff08;如VLC&#xff09;在RTSP实时播放场景中面临高延迟&#xff08;通常数秒&#xff09;和资源占用大的问题。本文提出一种跨平台解决方案&#xff0c;通过网络层…

HTTP 失败重试(重发)方案

在 Qt 网络开发中&#xff0c;使用 QNetworkAccessManager 进行 HTTP 请求时&#xff0c;可能会遇到网络超时、服务器错误等情况。为了提高请求的可靠性&#xff0c;可以实现 HTTP 失败重试&#xff08;重发&#xff09; 机制。下面介绍几种常见的 失败重发方案&#xff1a; 单…

大白话详细解读React框架的diffing算法

1. Diffing 算法是什么&#xff1f; Diffing 算法是 React 用来比较虚拟 DOM&#xff08;Virtual DOM&#xff09;树的一种算法。它的作用是找出前后两次渲染之间的差异&#xff08;diff&#xff09;&#xff0c;然后只更新这些差异部分&#xff0c;而不是重新渲染整个页面。 …

【Linux内核系列】:动静态库详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 有些鸟儿是注定是关不住的&#xff0c;因为它们的每一片羽翼都沾满了自由的光辉 ★★★ 本文前置知识&#xff1a; 编译与链接的过程…

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek&#xff1a;部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型&#xff0c;其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面&#xff0c;对Deep…

【详细解决】pycharm 终端出现报错:“Failed : 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

昨天在终端一顿操作后突然打开pycharm时就开始报错&#xff1a; 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1 Failed to act…

【电路笔记】-D型触发器

D型触发器 文章目录 D型触发器1、概述2、主从D触发器3、使用D型触发器进行分频4、D触发器作为数据锁存器5、透明数据锁存器6、总结D型触发器是一种改进的置位-复位触发器,通过增加一个反相器来防止S和R输入处于相同的逻辑电平。 1、概述 D型触发器克服了基本SR NAND门双稳态电…