Linux -- 初识信号
目录
什么是信号?
如何使用信号?
代码:
testSig.cc
makefile:
验证:
2号信号:
9号信号:
建立对信号的认识:
信号的处理
自定义信号的处理方式:
signal 函数:
参数
返回值
代码1(以2号信号为例):
验证1:
代码2:
验证2:
编辑
忽略信号:
代码:
验证:
什么是信号?
信号是 Linux 系统提供的、让用户(进程)给其他进程发送异步信号的一种方式,用于通知进程发生了某个事件。
异步:一种编程模型或操作模式,在这种模式下,任务的执行不会阻塞或等待其他任务完成,而是独立进行,并且可以在任务完成时通过回调、事件或其他机制通知主程序。
指令 kill -l 可以查看 Linux 中的信号,可以注意到,没有 0号、32号、33号信号,且从 34号信号开始,信号名字中都带有 RT:
如何使用信号?
下面用简单的代码来认识一些常见的信号:
代码:
testSig.cc
#include<iostream>
using namespace std;
#include<unistd.h>
#include<sys/types.h>
int main()
{while(1){cout<<" I am activing ... pid: "<<getpid()<<endl;sleep(1);}return 0;
}
makefile:
testSig:handlerSig.ccg++ -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f testSig
验证:
指令 kill -signal pid 就可以向指定进程发送信号。
2号信号:
2号信号在Linux系统中对应的是
SIGINT
(Interrupt Signal),通常被称为中断信号,用于请求中断正在运行的程序。
可以看出,死循环的进程在收到信号后结束死循环,进程终止:
指令必须带 pid,不能是进程名:
指令中的 -signal 可以是数字,也可以是信号的名字(即宏定义):
9号信号:
9号信号在Linux系统中对应的是
SIGKILL
信号,是一个强制终止信号,用于立即终止进程。
进程收到信号后,会打印 "Killed":
建立对信号的认识:
初步了解了什么是信号后,我们需要建立以下对信号的认识:
1、还没有向指定进程发送信号时,进程已经知道收到信号时,该怎么处理了;
2、信号能够被识别出来,也就是说,编写内核的才程序员提前给进程设定好了识别特定信号的方式;
3、进程收到信号时,如果进程正在处理更重要的事情,进程可以暂时不处理收到的信号,但是进程必须临时保存该信号!
4、进程收到信号时,可以不立即处理,可以在合适的时候处理;
5、信号可以随时产生!我们无法预测信号什么时候发送,所以信号是异步发送的!
以上的认识可以结合日常生活的例子理解,比如,把早起的闹钟设为一种信号,我们在闹钟响之前,已经知道听到闹钟时该怎么处理这个信号了,那就是起床,我们也可以先不起床,等到想起床的时候再起床,而且,我们在睡梦中无法预测闹钟什么时候会响。
信号的处理
从上面两个信号的例子可以看出,进程收到不同的信号后,有不同的处理方式,而以上的信号处理方式,是信号处理的默认动作,我们还可以捕捉信号,自定义信号的处理方式,或者忽略信号!
自定义信号的处理方式:
signal 函数:
signal
函数是 Linux 系统中用于设置信号处理函数的简单接口。它允许你指定当进程接收到某个信号时应调用哪个函数,而不是默认的信号处理方式。
#include <signal.h>void (*signal(int signum, void (*handler)(int)))(int);
参数
signum: 要处理的信号编号。
handler: 信号处理函数的指针,类型为
void (*)(int)
。这个函数会在接收到指定信号时被调用,也就是说,如果进程没有收到指定信号,handler 函数将永远不会被调用!
返回值
成功: 返回之前的信号处理函数指针。
失败: 返回
SIG_ERR
,此时errno
会被设置为相应的错误码。
代码1(以2号信号为例):
#include<iostream>
using namespace std;
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>void handler(int signo)
{cout<<" I got a signal,signo:"<<signo<<endl;
}
int main()
{signal(SIGINT,handler);while(1){cout<<" I am activing ... pid: "<<getpid()<<endl;sleep(1);}return 0;
}
验证1:
代码2:
在代码1的基础上,设置了退出码:
#include<iostream>
using namespace std;
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>void handler(int signo)
{cout<<" I got a signal,signo:"<<signo<<endl;exit(100);
}
int main()
{signal(SIGINT,handler);while(1){cout<<" I am activing ... pid: "<<getpid()<<endl;sleep(1);}return 0;
}
验证2:
进程结束后,当我们查看退出码时,退出码为100:
忽略信号:
只需要在 signal 的 handler 参数传入 SIG_IGN,即可忽略指定的信号!
代码:
#include<iostream>
using namespace std;
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>int main()
{signal(SIGINT,SIG_IGN);while(1){cout<<" I am activing ... pid: "<<getpid()<<endl;sleep(1);}return 0;
}
验证:
可以看出,当我们向进程发送 2号信号时,进程忽略了 2号信号,不做任何处理,于是发送 9号信号终止进程!
相关文章:

Linux -- 初识信号
目录 什么是信号? 如何使用信号? 代码: testSig.cc makefile: 验证: 2号信号: 9号信号: 建立对信号的认识: 信号的处理 自定义信号的处理方式: signal 函数…...

Ubuntu系统如何实现键盘按键映射到其他按键(以 Ctrl+c 映射到 F3,Ctrl+v 映射到 F4 为例)
文章目录 写在前面1. 功能描述2. 实现步骤2.1 安装AutoKey2.2 软件设置2.2.1 软件设置 2.3 测试是否安装成功 参考链接 写在前面 自己的测试环境: Ubuntu20.04 1. 功能描述 Ubuntu系统使用Ctrlc 、Ctrlv 进行复制粘贴操作的时候,时间长了就会出现小拇指…...

el-select、el-autocomplete的选项内容过长显示完整内容
问题: el-select、el-autocomplete的选项内容过长需要看清完整内容 解决方案: 使用el-popover悬停显示完整内容 代码: <el-form-item label"备注" prop"remark"><el-autocomplete v-model"form.remar…...
Go-单元测试
单元测试 测试用例的命名必须是以xxx_test.go的格式 测试用例函数必须以TestXxx开头,一般来说是Test被测试函数名,且必须为大驼峰命名 TestAdd(t *tesing.T)的形参类型必须是*tesing.T 运行测试用例指令 cmd>go test 运行正确,无日志&a…...

【Linux】IPC 进程间通信(一):管道(匿名管道命名管道)
✨ 无人扶我青云志,我自踏雪至山巅 🌏 📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 &#…...

Kotlin类与对象
类的定义与对象创建 类的创建是比较简单的,主要是看一下注意点: 1.如果主构造函数没有任何注释或可见性修饰符,则可以省略constructor关键字,如果类中没有其他内容要写,可以直接省略花括号,最后就变成下面…...

Windows版 nginx安装,启动,目录解析,常用命令
Windows版 nginx安装,启动,目录解析,常用命令 一级目录二级目录三级目录 1. 下载2. 启动方式一:方式二: 3. 验证是否启动4. 安装目录解析5. 常用命令 一级目录 二级目录 三级目录 1. 下载 官网下载:ngi…...

基于51单片机的电子隐形防盗网proteus仿真
地址: https://pan.baidu.com/s/1TSuRsB2i1tgAHjI0Miz3AQ 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

Fish Agent:多语言 Voice-to-Voice 开源语音模型;Runway 推出摄像机运镜功能丨 RTE 开发者日报
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…...
locust压测工具环境搭建(Linux、Mac)
目录 使用anaconda搭建locust环境 1、anaconda安装python环境(推荐) 2、从conda安装locust 使用python虚拟环境搭建locust环境 1、直接安装python环境 2、从python环境安装locust 从依赖文件中安装locust环境 1、从anaconda安装locust 2、从pyt…...
欠定方程有多个真正解,超定方程可能无解所以有最小二乘解
Ax b x A\b ,但不是b/A,会报错矩阵维度不对应两个未知数,三个方程也可以是最小二乘解,因为无解满足三个方程,比如下面 A [0, 1; 1, 1;3,6]; % 一个接近奇异的矩阵 b [1; 2;3]; x A\b; % 求解线性方程组 % warning(off, MATLAB:…...
LeetCode27:移除元素
原题地址:. - 力扣(LeetCode) 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k…...

JAVA 插入 JSON 对象到 PostgreSQL
博主主页:【南鸢1.0】 本文专栏:JAVA 目录 编辑 简介 所用: 1、 确保 PostgreSQL 数据库支持 JSON: 2、添加 PostgreSQL JDBC 驱动 3、安装和运行 PostgreSQL 4、建立数据库的连接 简介 在现代软件开发中,由于 JSON 数据…...
视图,物化视图,普通表区别简介
普通视图与物化视图的主要区别: 数据存储方式: 普通视图:不存储数据,仅包含查询定义。查询时,Oracle会根据视图的定义转换为相应的SQL语句去查询底层数据。物化视图:实际存储数据,类似于物理表。…...

C++ | Leetcode C++题解之第530题二叉搜索树的最小绝对差
题目: 题解: class Solution { public:void dfs(TreeNode* root, int& pre, int& ans) {if (root nullptr) {return;}dfs(root->left, pre, ans);if (pre -1) {pre root->val;} else {ans min(ans, root->val - pre);pre root-&g…...

使用Node.js构建实时聊天应用
使用Node.js构建实时聊天应用 Node.js简介 安装Node.js 使用npm安装依赖 创建基本的Web服务器 设置静态文件夹 创建聊天客户端 连接WebSocket 发送消息 接收消息 处理消息 实现私聊功能 实现群聊功能 用户身份验证 存储聊天记录 使用WebSocket进行文件传输 使用WebSocket进行屏…...

STM32F103C8T6学习笔记1--新建工程模板
1、简介 STM32是一系列由STMicroelectronics(瑞士意法半导体)公司设计和生产的32位微控制器产品线。这些微控制器基于ARM Cortex-M内核,并具有高性能、低功耗和多种外设接口的特点。STM32处理器被广泛应用于各种嵌入式系统领域,包…...

RK3568平台开发系列讲解(内存篇)Linux 内存优化
🚀返回专栏总目录 文章目录 一、如何正确采集 Linux 内存可用空间二、系统内存优化参考步骤2.1、优化 Linux Kernel module 所占用的内存空间2.3、将 Wi-Fi built-in kernel2.4、优化 Linux 文件系统所占用的内存空间2.5、上层优化2.6、客户定制优化2.6.1、对具体客户的具体产…...

企业数字化转型实施中的挑战与解决方案:架构引领的战略路径
在企业推动数字化转型的过程中,通常会面临复杂的挑战。随着技术的不断演进和业务环境的变化,企业架构(Enterprise Architecture, EA)成为帮助企业应对这些挑战的关键工具。通过提供一个全面的战略蓝图,EA使企业能够在保…...

《数字图像处理基础》学习05-数字图像的灰度直方图
目录 一,数字图像的数值描述 1,二值图像 2,灰度图像 3,彩色图像 二,数字图像的灰度直方图 一,数字图像的数值描述 在之前的学习中,我知道了图像都是二维信息&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...