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号信号终止进程!

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

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

相关文章

群控系统服务端开发模式-应用开发-腾讯云上传工厂及七牛云上传工厂开发

记住业务流程图&#xff0c;要不然不清楚自己封装的是什么东西。 一、腾讯云工厂开发 切记在根目录下要安装腾讯云OSS插件&#xff0c;具体代码如下&#xff1a; composer require qcloud/cos-sdk-v5 在根目录下extend文件夹下Upload文件夹下channel文件夹中&#xff0c;我们修…

论文阅读神器:没时间读文献,谷歌AI工具NotebookLM 带你5分钟听懂一篇论文

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 读文献太慢&#xff0c;新文献根本读不完怎么办&#xff1f;谷歌的AI工具&#xff0c;NotebookLM&#xff0c;带你像听播客一样轻松“听”文献&#xff0c;短短几分钟内抓住论…

pycharm configurations中配置运行fastapi项目

环境 windows11 python3.11 fastapi0.115 使用virtualenv安装fastapi uvicorn pip install fastapi pip install uvicorn目的 在pycharm中可以一键运行&#xff0c;直接把命令行的运行参数配置到pycharm中, 即使用"uvicorn main:app --reload"运行main文件 配置 …

Bypassuac之白名单结合注册表方式

参考 Bypass UAC 原来这么简单 本章记录一下系统白名单文件结合注册表bypassuac&#xff0c;uac这个东西并不是Windows设置的防御机制而是相当于保护机制&#xff0c;只是用来控制用户行为的&#xff0c;弹个窗来提醒一下用户的行为&#xff0c;和直接的杀软是不一样的性质&am…

Canvas字体高度计算与PDF高度如何统一

因为英文书写时并不是像汉字一样就是一个方块字&#xff0c;比如下图p有部分是在基线以下&#xff0c;其他的字体都是以基线为参照书写&#xff0c;所以在Canvas中字(或字母)所占的高度是&#xff1a; metrics.boundingBoxAscent metrics.boundingBoxDescent上行间距下行间距…

UV紫外相机

在产业设备领域&#xff0c;运用相机进行检测的需求很大&#xff0c;应用也很多样&#xff0c;对于图像传感器性能的期望逐年提升。在这样的背景下&#xff0c;可拍摄紫外线&#xff08;UV&#xff1a;Ultra Violet&#xff09;图像的相机拥有越来越广泛的应用场景。将UV照明和…

Java NIO2 异步IO支持

NIO2 从 Java 7 在之前的NIO基础上&#xff0c;它提供了异步 IO 操作、文件系统访问增强等诸多功能 路径&#xff08;Path&#xff09;接口 Path 接口代表了文件系统的路径。它可以用来定位一个文件或目录。 提供了多种方法来解析、转换和查询路径信息。Paths 类提供了一些静…

实现短信中带有链接,直接打开微信小程序

步骤1&#xff1a;生成 Scheme&#xff08;明文&#xff09; 此处配置的 path 需要在小程序后台配置 之后得到一条 scheme weixin://dl/business/?appidxxx&pathpages/index/index 这条 scheme 在某些场景下可以直接点击打开小程序&#xff0c;比如&#xff1a;作为钉钉消…

鸿蒙网络编程系列41-仓颉版HttpRequest模拟登录示例

1. HttpRequest模拟登录简介 在本系列的第9篇文章《鸿蒙网络编程系列9-使用HttpRequest模拟登录示例》中&#xff0c;我们基于ArkTS语言在API 9的环境下使用HttpRequest发起HTTP请求&#xff0c;模拟了对目标网站的登录&#xff0c;本文将使用仓颉语言在API 12的环境中实现类似…

国内能用的Docker镜像源【2024最新持续更新】

国内能用的Docker镜像源【2024最新持续更新】 Docker 镜像加速列表&#xff08;2024年11月已更新&#xff09;配置方式1&#xff1a;临时使用配置方式2&#xff1a;长久有效 在国内使用 Docker 的朋友们&#xff0c;可能都遇到过配置镜像源来加速镜像拉取的操作。然而&#xff…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

RabbitMQ 的集群

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ 的集群】面试题&#xff1f;希望对大家有帮助&#xff1b; RabbitMQ 的集群 RabbitMQ 是一种流行的开源消息代理&#xff0c;广泛用于构建分布式系统中的消息队列。随着应用程序规模的扩大&#xff0c;单一的 RabbitMQ 实…

IO详解(BIO、NIO、实战案例、底层原理刨析)

文章目录 IO详解&#xff08;BIO、NIO、实战案例、底层原理刨析&#xff09;&#x1f30e; IO&#x1fa90; 同步、异步、阻塞、非阻塞⚡ BIO&#x1f47d; 简介&#x1f60e; 案例 &#x1f680; NIO✈️ 介绍&#x1f697; Buffer&#xff08;缓冲&#xff09;&#x1f6f8; …

Mac 配置SourceTree集成云效

1、背景 工作使用的是自己的笔记本&#xff0c;一个是比较卡&#xff0c;在一个是敏感信息比较多还是使用公司的电脑&#xff0c;但是系统是Mac就很麻烦&#xff0c;在网上找了帖子记录一下 2、配置 打开终端 ssh-keygen -t rsa #一直回车就行 cd .ssh cat id_rsa.pub #查…

.NET 8 Web API 中的身份验证和授权

本次介绍分为3篇文章&#xff1a; 1&#xff1a;.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2&#xff1a;在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3&#xff1a;.NET …

【论文阅读】Associative Alignment for Few-shot Image Classification

用于小样本图像分类的关联对齐 引用&#xff1a;Afrasiyabi A, Lalonde J F, Gagn C. Associative alignment for few-shot image classification[C]//Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part V 16. Spri…

第03章 MySQL的简单使用命令

一、MySQL的登录 1.1 服务的启动与停止 MySQL安装完毕之后&#xff0c;需要启动服务器进程&#xff0c;不然客户端无法连接数据库。 在前面的配置过程中&#xff0c;已经将MySQL安装为Windows服务&#xff0c;并且勾选当Windows启动、停止时&#xff0c;MySQL也 自动启动、停止…

【Fastjson反序列化漏洞:深入了解与防范】

一、Fastjson反序列化漏洞概述 Fastjson是一款高性能的Java语言JSON处理库&#xff0c;广泛应用于Web开发、数据交换等领域。然而&#xff0c;由于fastjson在解析JSON数据时存在安全漏洞&#xff0c;攻击者可以利用该漏洞执行任意代码&#xff0c;导致严重的安全威胁。 二、F…

Python自动化测试一文详解

Python 作为一种高效、易读的编程语言&#xff0c;凭借其丰富的库和框架&#xff0c;成为自动化测试领域的热门选择。无论是Web应用、API&#xff0c;还是移动应用&#xff0c;Python 都能提供强大的支持&#xff0c;使得测试人员能够快速编写和维护测试用例。 本文将深入探讨…

一个免费开源自托管的机器翻译项目,支持API接口

大家好&#xff0c;今天给大家分享一个免费且开源的机器翻译项目LibreTranslate&#xff0c;旨在为用户提供一个完全自由且安全的翻译解决方案。 项目介绍 LibreTranslate采用神经翻译技术&#xff0c;使用开源语言模型对文本进行翻译&#xff0c;无需依赖外部服务。该项目的主…