Linux信号——信号的产生(1)

注:信号vs信号量:两者没有任何关系!

信号是什么?

Linux系统提供的,让用户(进程)给其他进程发送异步信息的一种方式。

进程看待信号的方式:

1.信号在没有发生的时候,进程已经知道信号发生时该如何处理。

2.进程能够认识进程,很早之前,有人给进程中设置了识别特定信号的方式。

3.信号到来的时候,进程正在处理更重要的事情,进程暂时不能处理到来的信号,进程必须暂时要将到来的信号进行临时保存。

4.信号到了,可以不立即处理,可以在合适的时间处理。

5.信号是随时产生的,进程无法准确预料,所以信号是异步发送的。

为什么要有信号?

系统要求进程要有随时响应外部信号的能力,随后做出反应。

信号的具体知识

以这个时间轴进行学习
在这里插入图片描述

信号的产生

常见信号

数组和名字都可以标识信号,名字其实就是宏。
使用kill命令查看信号。
在这里插入图片描述
1-31为常用信号,右下的红框中是实时信号。
没有0,没有32,33 信号,共62个信号

信号的处理的方式——signal

a. 默认动作
b. 自定义处理信号——捕捉
c. 忽略了信号——是处理了信号吗?是的,处理方式就是忽略。
实际执行信号的处理动作称之为信号的递达,也就是以上三种方式。

signal函数

#include <signal.h>typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

参数说明:
signum:信号编号(如 SIGINT、SIGTERM)。
handler:信号处理函数,可以是:
SIG_DFL:恢复默认行为。
SIG_IGN:忽略信号。
自定义函数指针:用户定义的处理函数。

返回值:(类型函数指针)
成功时返回之前的处理函数的地址。
失败时返回 SIG_ERR。

产生信号的第一种方式:kill命令

kill -9 进程pid :发送一个信号,杀死一个进程

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
int main()
{while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

结果:
使用命令kill -9 1121788
在这里插入图片描述
进程被杀死。


kill -2 进程pid :发送一个信号,默认行为是使进程自己终止。

1.默认行为——进程自己终止

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
int main()
{while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

结果:
在运行的进程中使用kill -2 1121490
在这里插入图片描述
进程自己终止。

2.自定义处理信号——捕捉

例子:

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
void handler(int signo)
{std::cout << "get a sig, number is: "<< signo << std::endl;
}
int main()
{//signal调用完了,handler方法会被立即执行吗?不会,只是设置对应信号的处理方法。//未来我们收到对应的信号才执行handler方法。//未来进程如果一直没有收到SIGINT,handler也就永远不会被调用。signal(SIGINT,handler);//handler(SIGINT)while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

结果:
在运行的进程中使用kill -2 1120892
在这里插入图片描述
默认行为被更改成其他方法。

3.忽略信号

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
int main()
{signal(SIGINT,SIG_IGN);//ignore忽略while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

结果:
在运行的进程中使用kill -2 1120892
在这里插入图片描述
进程无任何反应——这条信号被忽略。

产生信号的第二种方式:键盘产生信号

Ctrl + c 被操作系统解释成2号信号
Ctrl + \ 被操作系统解释成3号信号

产生信号的第三种方式:系统调用

kill 系统调用函数

对任意进程发送任意信号。

#include <sys/types.h>
#include <signal.h>int kill(pid_t pid, int sig);

参数说明:
pid目标进程的进程 ID,具体行为取决于其取值:
>0:发送信号给 PID 为 pid 的进程。
=0:发送信号给当前进程组内的所有进程。

sig:要发送的信号编号(如 SIGTERM、SIGKILL)。

返回值:
成功返回 0,失败返回 -1,并设置 errno 。

例子:自定义mykill函数

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<errno.h>
#include<string.h>
using namespace std;//mykill -9 pid
int main(int argc,char* argv[])
{if(argc != 3){cout << "Usage: " << argv[0] << " -signumber pid" << endl;return 1;}int signumber = stoi(argv[1]+1);int pid = stoi(argv[2]);int n = kill(pid, signumber);if(n < 0){cerr << "kill error, " << strerror(errno) << endl;}return 0;
}

raise 系统调用函数

对当前进程发送任意信号。

#include <signal.h>int raise(int sig);  // 向当前进程发送信号 sig

参数说明:
sig: 信号编号(如 SIGINT、SIGTERM)。
返回值:
成功返回 0,失败返回非 0。

abort系统调用函数

对当前进程发送6号信号。

#include <stdlib.h>  // 必须包含的头文件void abort(void);

**参数说明:**无(void)。
**返回值:**无返回值(void)。

产生信号的第四种方式:软件条件

alarm函数
对当前进程等待 seconds 秒后发送14号信号。

#include <unistd.h>unsigned int alarm(unsigned int seconds);

参数说明: seconds – 定时器的时间(秒)。若为 0,表示取消之前设置的定时器。
返回值:
返回之前尚未触发的定时器的剩余秒数。
若之前没有定时器,返回 0。

例子: 向当前进程5秒后发送14号信号,终止进程。

int main()
{alarm(5);//响一次int cnt = 0;while(true){sleep(1);cout<< "cnt: "<< cnt++ << endl;}return 0;
}

结果: 向进程发送了14号信号,终止进程
在这里插入图片描述
注:闹钟只响一次。

例: 关于alarm的返回值

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
using namespace std;int g_cnt = 0;
int ret = 0;void handler(int sig)
{std::cout << "get a sig: "<< sig <<" g_cnt: "<< g_cnt <<endl;int n = alarm(2);cout<<"剩余时间:"<< n <<endl;
}int main()
{signal( 2 ,handler);alarm(50);//响一次int cnt = 0;while(true){sleep(1);cout<< "cnt: "<< cnt++ << endl;}return 0;
}

结果: 在 cnt:3 时按下 Ctrl + C
在这里插入图片描述
这时获取alarm的返回值是剩余时间。

产生信号的第五种方式:异常

  1. 除0错误
    例子:
#include<iostream>
#include<unistd.h>int main()
{int a = 10;a = a/0;while(true) sleep(1);return 0;}

出现除0错误。
结果:发送8号信号(SIGFPE)
在这里插入图片描述

  1. 野指针问题
    例子:
#include<iostream>
#include<unistd.h>int main()
{int *p = nullptr;*p = 100;//野指针while(true) sleep(1);return 0;}

结果:发送11号信号(SIGEGV)
在这里插入图片描述

关于信号产生的各种情况的理解

信号保存在进程的PCB中,且以位图的方式保存在PCB中。
在PCB中以 uint32_t pending 变量进行保存。在这里插入图片描述
给进程发送信号,其实就是写入信号。向进程PCB中写入信号数据,PCB是内核数据结构,只有操作系统有权限写入,若用户想写入,操作系统提供系统调用供用户使用。
所以以上的信号产生的5种方式,实际上最终都是交给操作系统进行最后向进程写入信号的操作。

对于异常问题的解释

  1. 除0错误
    在这里插入图片描述
  2. 野指针
    在这里插入图片描述

总结

在这里插入图片描述

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

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

相关文章

数据结构和算法——汉诺塔问题

前言 先讲个故事&#xff0c;传说古代印度有三根黄金柱&#xff0c;64个石盘&#xff0c;需要将石盘从第一根移动到第三根上&#xff0c;规定每次只能移动一片&#xff0c;并且小盘在放置时必须在大盘上。 当石盘移动完毕时&#xff0c;世界就会毁灭。 汉诺塔——递归 接下来…

2023年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中错误的是 A. 向量是线性结构 B. 非空线性结构中只有一个结点没有前件 C. 非空线性结构中只有一个结点没有后件 D. 只有一个根结点和一个叶子结点的结构必定是线性结构 概念澄清 首先&#xff0c;我们需要明确几个关键概念&#xf…

Kafka简单的性能调优

Kafka 的性能调优是一个系统性工程&#xff0c;需要从生产者、消费者、Broker 配置以及集群架构等多个层面进行综合调整。以下是一些关键的性能调优策略&#xff1a; 一、生产者性能优化 批量发送 batch.size&#xff1a;控制消息批量的最大字节数&#xff0c;默认值为 16KB。…

微前端 - 以无界为例

一、微前端核心概念 微前端是一种将单体前端应用拆分为多个独立子应用的架构模式&#xff0c;每个子应用可独立开发、部署和运行&#xff0c;具备以下特点&#xff1a; 技术栈无关性&#xff1a;允许主应用和子应用使用不同框架&#xff08;如 React Vue&#xff09;。独立部…

企业级日志分析平台: ELK 集群搭建指南

前言&#xff1a;在当今数字化时代&#xff0c;数据已经成为企业决策的核心驱动力。无论是日志分析、用户行为追踪&#xff0c;还是实时监控和异常检测&#xff0c;高效的数据处理和可视化能力都至关重要。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作为全球…

1.2-WAF\CDN\OSS\反向代理\负载均衡

WAF&#xff1a;就是网站应用防火墙&#xff0c;有硬件类、软件类、云WAF&#xff1b; 还有网站内置的WAF&#xff0c;内置的WAF就是直接嵌在代码中的安全防护代码 硬件类&#xff1a;Imperva、天清WAG 软件&#xff1a;安全狗、D盾、云锁 云&#xff1a;阿里云盾、腾讯云WA…

MybatisPlus(SpringBoot版)学习第四讲:常用注解

目录 1.TableName 1.1 问题 1.2 通过TableName解决问题 1.3 通过全局配置解决问题 2.TableId 2.1 问题 2.2 通过TableId解决问题 2.3 TableId的value属性 2.4 TableId的type属性 2.5 雪花算法 1.背景 2.数据库分表 ①垂直分表 ②水平分表 1>主键自增 2>取…

第二届计算机网络和云计算国际会议(CNCC 2025)

重要信息 官网&#xff1a;www.iccncc.org 时间&#xff1a;2025年4月11-13日 地点&#xff1a;中国南昌 简介 第二届计算机网络和云计算国际会议&#xff08;CNCC 2025&#xff09;将于2025年4月11-13日在中国南昌召开。围绕“计算机网络”与“云计算”展开研讨&#xff…

【大模型基础_毛玉仁】5.4 定位编辑法:ROME

目录 5.4 定位编辑法&#xff1a;ROME5.4.1 知识存储位置1&#xff09;因果跟踪实验2&#xff09;阻断实验 5.4.2 知识存储机制5.4.3 精准知识编辑1&#xff09;确定键向量2&#xff09;优化值向量3&#xff09;插入知识 5.4 定位编辑法&#xff1a;ROME 定位编辑&#xff1a;…

横扫SQL面试——连续性登录问题

横扫SQL面试 &#x1f4cc; 连续性登录问题 在互联网公司的SQL面试中&#xff0c;连续性问题堪称“必考之王”。&#x1f4bb;&#x1f50d; 用户连续登录7天送优惠券&#x1f31f;&#xff0c;服务器连续报警3次触发熔断⚠️&#xff0c;图书馆连续3天人流破百开启限流⚡” …

Spring AI Alibaba 对话记忆使用

一、对话记忆 (ChatMemory)简介 1、对话记忆介绍 ”大模型的对话记忆”这一概念&#xff0c;根植于人工智能与自然语言处理领域&#xff0c;特别是针对具有深度学习能力的大型语言模型而言&#xff0c;它指的是模型在与用户进行交互式对话过程中&#xff0c;能够追踪、理解并利…

vdi模式是什么

‌VDI模式&#xff08;Virtual Desktop Infrastructure&#xff09;是一种基于服务器的计算模型&#xff0c;其核心思想是将所有计算和存储资源集中在服务器上&#xff0c;用户通过前端设备&#xff08;如瘦客户机&#xff09;访问服务器上的虚拟桌面‌‌ VDI模式的工作原理 在…

【分布式】深入剖析 Sentinel 限流:原理、实现

在当今分布式系统盛行的时代&#xff0c;流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件&#xff0c;在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点&#xff0c;助力开发者更好地运用这一工具…

c#winform,倒鸭子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果

不废话 直接上效果图 C# winform 开发抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再网上常说的倒鸭子字幕效果 主要功能 1&#xff0c;软件可以自定义添加字幕内容 2&#xff0c;软件可以添加字幕显示的时间区间 3&#xff0c;可以自定义字幕颜色&#xff0c;可以随…

Pycharm(八):字符串切片

一、字符串分片介绍 对操作的对象截取其中一部分的操作&#xff0c;比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法&#xff1a;字符串变量名 [起始:结束:步长] 口诀&#xff1a;切片其实很简单&#xff0c;只顾头来…

图片解释git的底层工作原理

&#xff08;图片来源&#xff1a;自己画的&#xff09; 基于同一个commit创建新分支 &#xff08;图片来源&#xff1a;书籍《Linux运维之道》 ISBN 9787121461811&#xff09; 在新分支上修改然后commit一次 &#xff08;图片来源&#xff1a;书籍《Linux运维之道》 ISBN 978…

leetcode994.腐烂的橘子

思路源自 【力扣hot100】【LeetCode 994】腐烂的橘子&#xff5c;多源BFS 这里图中的腐烂的的橘子是同时对周围进行腐化&#xff0c;所以采用多源bfs就能解决 多源bfs与单源bfs的区别就在于队列取出时一轮是取出队列当中的全部元素 class Solution {public int orangesRotti…

【华为OD技术面试真题 - 技术面】- Java面试题(15)

华为OD面试真题精选 专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录 介绍下TCP/UDP TCP(传输控制协议)和 UDP(用户数据报协议) TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是两种常见的传输层协议,主要…

‌在 Fedora 系统下备份远程 Windows SQL Server 数据库的完整方案

‌一、环境准备与工具安装‌ ‌1. 安装 Microsoft SQL Server 命令行工具‌ Fedora 需安装 mssql-tools 和 ODBC 驱动&#xff1a; # 添加 Microsoft 仓库 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安装工具包 …

DeepSeek:巧用前沿AI技术,开启智能未来新篇章

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;大模型成为全球科技竞争的核心赛道。在这场AI革命中&#xff0c;DeepSeek作为中国领先的大模型研发团队&#xff0c;凭借其创新的技术架构、高效的训练方法和广泛的应用场景&#xff0c;迅…