【linux学习指南】初识Linux进程信号与使用
文章目录
- 📝信号快速认识
- 📶⽣活⻆度的信号
- 📶 技术应⽤⻆度的信号
- 🌉 前台进程(键盘)
- 🌉⼀个系统函数
- 📶信号概念
- 📶查看信号
- 🌠 信号处理
- 🌉 忽略此信号
- 🌉 执⾏该信号的默认处理动作。
- 🌉 切换状态函数
- 🚩总结
📝信号快速认识
📶⽣活⻆度的信号
- 你在⽹上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”
- 当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的⾏为并不是⼀定要⽴即执⾏,可以理解成“在合适的时候去取”。
- 在收到通知,再到你拿到快递期间,是有⼀个时间窗⼝的,在这段时间,你并没有拿到快递,但是你知道有⼀个快递已经来了。本质上是你“记住了有⼀个快递要去取”
- 当你时间合适,顺利拿到快递之后,就要开始处理快递了。⽽处理快递⼀般⽅式有三种:
- 1.执⾏默认动作(幸福的打开快递,使⽤商品)
- 2.执⾏⾃定义动作(快递是零⻝,你要送给你你的⼥朋友)
-
- 忽略快递(快递拿上来之后,扔掉床头,继续开⼀把游戏)
快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话
基本结论:
- 你怎么能识别信号呢?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。
- 信号产⽣之后,你知道怎么处理吗?知道。如果信号没有产⽣,你知道怎么处理信号吗?知道。所以,信号的处理⽅法,在信号产⽣之前,已经准备好了。
- 处理信号,⽴即处理吗?我可能正在做优先级更⾼的事情,不会⽴即处理?什么时候?合适的时候。
- 信号到来|信号保存 |信号处理
- 怎么进⾏信号处理啊?a.默认b.忽略c.⾃定义,后续都叫做信号捕捉。
📶 技术应⽤⻆度的信号
🌉 前台进程(键盘)
样例:
sig.cc
:
#include <iostream>
#include <unistd.h>int main()
{while(true){std::cout<< "I am a process, I am wiat signal!" <<std::endl;sleep(1);}return 0;
}
Makefile
:
BIN=sig
OBJS=$(SRCS:.cc=.o)
SRCS=$(shell ls *.cc)
CC=g++$(BIN):$(OBJS)$(CC) -o $@ $^ -std=c++11%.o:%.cc$(CC) -c $< -std=c++11.PHONY:clean
clean:rm -f $(BIN) $(OBJS)
⽤⼾输⼊命令,在Shell下启动⼀个前台进程
⽤⼾按下程Ctrl+C
,这个键盘输⼊产⽣⼀个硬件中断,被OS获取,解释成信号,发送给⽬标前台进
前台进程因为收到信号,进⽽引起进程退出
🌉⼀个系统函数
指令:
man signal
而其实,ctrl+C
的本质是向前台进程发送|SIGINT|
即2
号信号,我们证明一下,这里需要引入一个系统调用函数
NAMEsignal - ANSI C signal handlingSYNOPSIS#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);
参数说明:
signum
:信号编号[后⾯解释,只需要知道是数字即可]
handler
:函数指针,表⽰更改信号的处理动作,当收到对应的信号,就回调执⾏handler
⽅法
代码:
#include <iostream>
#include <unistd.h>
#include <signal.h>void handler(int signumber)
{std::cout<<"我是:"<<getpid() <<",我获得一个信号:"<< signumber <<std::endl;
}int main()
{std::cout<<"我是进程: "<<getpid() <<std::endl;signal(SIGINT/*2*/, handler);while(true){std::cout<<"I am a process, I am waiting signal!"<< std::endl;sleep(1);}return 0;
}
思考:
- 这⾥进程为什么不退出?
- 这个例⼦能说明哪些问题?信号处理,是⾃⼰处理
- 请将⽣活例⼦和Ctrl-C 信号处理过程相结合,解释⼀下信号处理过程?进程就是你,
操作系统就是快递员,信号就是快递,发信号的过程就类似给你打电
注意:
- 要注意的是,
signal
函数仅仅是设置了特定信号的捕捉⾏为处理⽅式,并不是直接调⽤处理动作。如果后续特定信号没有产⽣,设置的捕捉函数永远也不会被调⽤!! - Ctrl-C 产⽣的信号只能发给前台进程。⼀个命令后⾯加个&可以放到后台运⾏,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。
- Shell可以同时运⾏⼀个前台进程和任意多个后台进程,只有前台进程才能接到像
Ctrl-C
这种控制键产⽣的信号。 - 前台进程在运⾏过程中⽤⼾随时可能按下
Ctrl-C
⽽产⽣⼀个信号,也就是说该进程的⽤⼾空间代码执⾏到任何地⽅都有可能收到SIGINT
信号⽽终⽌,所以信号相对于进程的控制流程来说是异步(Asynchronous)
的。 - 可以渗透&和n
ohup
📶信号概念
信号是进程之间事件异步通知的⼀种⽅式,属于软中断。
📶查看信号
每个信号都有⼀个编号和⼀个宏定义名称,这些宏定义可以在signal.h
中找到,例如其中有定义
#define SIGINT 2
编号
34
以上的是实时信号,本章只讨论编号34以下的信号,不讨论实时信号。这些信号各⾃在什么条件下产⽣,默认的处理动作是什么,在signal(7)中都有详细说明:
man 7 signal
🌠 信号处理
(sigaction
函数稍后详细介绍),可选的处理动作有以下三种:
🌉 忽略此信号
#include <iostream>
#include <unistd.h>
#include <signal.h>void handler(int signumber)
{std::cout<<"我是:"<<getpid() <<",我获得一个信号:"<< signumber <<std::endl;
}int main()
{std::cout<<"我是进程: "<<getpid() <<std::endl;signal(SIGINT/*2*/, SIG_IGN);// 设置忽略信号的宏while(true){std::cout<<"I am a process, I am waiting signal!"<< std::endl;sleep(1);}return 0;
}
🌉 执⾏该信号的默认处理动作。
default
默认行为SIG_DFL
#include <iostream>
#include <unistd.h>
#include <signal.h>void handler(int signumber)
{std::cout<<"我是:"<<getpid() <<",我获得一个信号:"<< signumber <<std::endl;
}int main()
{std::cout<<"我是进程: "<<getpid() <<std::endl;// signal(SIGINT/*2*/, SIG_IGN);// 设置忽略信号的宏signal(SIGINT/*2*/, SIG_DFL);// 输⼊ctrl+c,进程退出,就是默认动作while(true){std::cout<<"I am a process, I am waiting signal!"<< std::endl;sleep(1);}return 0;
}
🌉 切换状态函数
其实这里就是转到用户自定义的handler
函数
提供⼀个信号处理函数,要求内核在处理该信号时切换到⽤⼾态执⾏这个处理函数,这种⽅式称为⾃定义捕捉(Catch)⼀个信号。
#include <signal.h>
#include <stdio.h>
#include <unistd.h> void signal_handler(int signum) { // 自定义的信号处理函数 printf("Caught signal %d\n", signum); // 在这里执行需要在用户态下运行的代码 // ...
} int main() { // 注册信号处理函数 signal(SIGINT, signal_handler); printf("Press Ctrl+C to send SIGINT signal...\n"); while (1) { // 等待信号到来 pause(); } return 0;
}
注意看源码:
/* Fake signal functions. */#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
/* Type of a signal handler. */
typedef void (*__sighandler_t) (int);
让我们来逐一分析:
-
#define SIG_ERR ((__sighandler_t) -1)
: 这个宏定义了SIG_ERR
,它被赋值为-1
,类型为__sighandler_t
。这通常用作signal()
函数的返回值,表示发生错误。 -
#define SIG_DFL ((__sighandler_t) 0)
: 这个宏定义了SIG_DFL
,它被赋值为0
,类型为__sighandler_t
。这用于指定使用默认的信号处理函数。 -
#define SIG_IGN ((__sighandler_t) 1)
: 这个宏定义了SIG_IGN
,它被赋值为1
,类型为__sighandler_t
。这用于指定忽略该信号。
其实SIG_DFL
和SIG_IGN
就是把0,1
强转为函数指针类型
🚩总结
相关文章:

【linux学习指南】初识Linux进程信号与使用
文章目录 📝信号快速认识📶⽣活⻆度的信号📶 技术应⽤⻆度的信号🌉 前台进程(键盘)🌉⼀个系统函数 📶信号概念📶查看信号 🌠 信号处理🌉 忽略此信…...

L1G1000 书生大模型全链路开源开放体系笔记
关卡任务 观看本关卡视频后,写一篇关于书生大模型全链路开源开放体系的笔记。 视频链接:【书生浦语大模型全链路开源体系】 : 书生浦语大模型开源开放体系_哔哩哔哩_bilibili 书生大模型全链路开源开放体系笔记 在人工智能领域,大模型的…...

亚信安全与飞书达成深度合作
近日,亚信安全联合飞书举办的“走近先进”系列活动正式走进亚信。活动以“安全护航信息化 共筑数字未来路”为主题,吸引了众多数字化转型前沿企业的近百位领导参会。作为“走近先进”系列的第二场活动,本场活动更加深入挖掘了数字化转型的基础…...
深入讲解Spring Boot和Spring Cloud,外加图书管理系统实战!
很抱歉,我的疏忽,说了这么久还没有给大家详细讲解过Spring Boot和Spring Cloud,那今天给大家详细讲解一下。 大家可以和下面这三篇博客一起看: 1、Spring Boot 和 Spring Cloud 微服务开发实践详解https://blog.csdn.net/speaking_me/artic…...

【三维生成】Edify 3D:可扩展的高质量的3D资产生成(英伟达)
标题:Edify 3D: Scalable High-Quality 3D Asset Generation 项目:https://research.nvidia.com/labs/dir/edify-3d demo:https://build.nvidia.com/Shutterstock/edify-3d 文章目录 摘要一、前言二、多视图扩散模型2.1.消融研究 三、重建模型…...
Java求职招聘网站开发实践
一、项目介绍 本文将介绍如何使用Java技术栈开发一个求职招聘网站。该网站主要实现求职者和招聘方的双向选择功能,包含用户管理、职位发布、简历投递等核心功能。 二、技术选型 后端框架:Spring Boot 2.7.0数据库:MySQL 8.0前端框架&#…...
一文详细了解websocket应用以及连接断开的解决方案
文章目录 websocketvite 热启动探索websocket -心跳websocket 事件监听应用过程中问题总结 websocket Websocket简介 定义和工作原理 Websocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP请求 - 响应模式不同,它允许服务器主动向客户端推送数据。例…...

如何做含有identify抓信号的fpga版本(image或者Bit)
在数字的FPGA debug中除了ila就是identify了,identify是synopsys公司的RTL级的调试工具。要用起来idetify,第一步就是要做出含有identify的信号的FPGA版本,quartus的是image,Ximlinx的是Bit或者Bin文件。具体有以下几步࿱…...

AIGC实践-使用Amazon Bedrock的SDXL模型进行文生图
一、Bedrock 简介 Amazon Bedrock 是 Amazon Web Services (AWS) 提供的一种生成式 AI 服务。通过 Bedrock,用户可以方便地使用多种基础模型(Foundation Models),包括 OpenAI 的 GPT、Anthropic 的 Claude 等。这些模型可以用于各…...

【源码】Sharding-JDBC源码分析之SQL中分片键路由ShardingSQLRouter的原理
Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

初学 flutter 环境变量配置
一、jdk(jdk11) 1)配置环境变量 新增:JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增:%JAVA_HOME%\bin2)验证是否配置成功(cmd运行命令) java java -version …...
蓝牙 AVRCP 协议详解
前言 随着无线音频设备的普及,蓝牙已经成为智能设备间通信的主流方式之一。除了传输音频流的 A2DP 协议外,AVRCP(Audio/Video Remote Control Profile,音频/视频远程控制协议)为用户提供了对蓝牙音频设备的控制能力&am…...
在 Ubuntu 18.04 上安装 MySQL 5.7和MySQL 8
1.Ubuntu安装MySQL 5.72.Ubuntu安装MySQL 8 在 Ubuntu 18.04 上安装 MySQL 5.7,可以按照以下步骤操作: 1. 更新系统包列表 运行以下命令以确保系统包列表是最新的: sudo apt update2. 检查默认 MySQL 版本 Ubuntu 18.04 默认提供 MySQL 5.…...

第4章 Spring Boot自动配置
自动配置概述 SpringBoot的两大核心 Spring Boot 框架的两大核心特性可以概括为“启动器”(Starter)和“自动配置”(Auto-configuration)。 启动器(Starter): Spring Boot 提供了一系列的 Star…...
显存:存储,GPU:计算;Pipeline Parallelism(管道并行)
目录 显存:存储,GPU:计算 流水线切分策略:(数据并并,多头并行,单头MLP切片) 存储(显存)和计算(GPU)负载不均衡的问题 1,2,3,4,5指的计算任务(数据切分) 大方块代表GPU计算 黄色代表显存 解决办法:重计算和流水线切分策略 重计算策略: 流水线切分策略:…...
费曼路径积分简单示例
费曼路径积分简单示例 费曼路径积分是量子力学中的一种计算方法,它通过对所有可能路径的贡献进行积分,来计算粒子从一个点到另一个点的概率幅。与经典力学不同,经典力学中粒子沿着使作用量最小的路径运动,而在量子力学中…...

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)
【实战】并发安全的配置管理器(功能扩展) 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…...

麒麟安全增强-kysec
DAC: 自主访问控制是linux下默认的接入控制机制,通过对资源读、写、执行操作,保证系统安全 MAC:安全接入控制机制,由操作系统约束的访问控制,默认情况下,MAC不允许任何访问,用户可以自定义策略规则制定允许什么 ,从而避免很多攻击。 MAC强制访问控制常见的实现方式:…...
shell编程(8)
目录 一、until循环 示例 until 和 while 的区别 二、case语句 基本语法 示例 1. 简单的 case 语句 2. 使用通配符 3. 处理多个匹配 case 和 if 的比较 case 语句: if 语句: 三、基本函数 基本函数定义和调用 1. 定义一个简单的函数 2. …...
高级java每日一道面试题-2024年11月24日-JVM篇-说说对象分配规则?
如果有遗漏,评论区告诉我进行补充 面试官: 说说对象分配规则? 我回答: 在Java高级面试中,对象分配规则是一个核心考点,它涉及到JVM的内存管理、对象的创建和初始化等多个方面。以下是对Java对象分配规则的详细解释: 一、内存分配区域 J…...

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

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...