当前位置: 首页 > article >正文

Linux进程信号详解(一):信号快速认识

一、信号快速认识信号现实生活中闹钟、红绿灯、上课铃声、狼烟、电话铃声、肚子叫、敲门声、脸色不好 ....1.1 生活中的信号 —— 快递的例子想象你网购了很多商品你能识别快递你知道快递员打电话时该怎么处理。即使快递没有到来你也知道快递来临的时候你该如何处理快递 。 —— 这是内置的识别能力。信号产生前你就知道处理方法即使快递没到你也知道“收到快递要拆开” —— 进程在信号产生前就已经准备好了处理函数。不必立即处理你正在打游戏可以5分钟后下楼取快递 ——信号不要求立即处理而是在“合适的时候”处理。记住有信号你知道有一个快递到了但还没取 —— 进程会保存未决信号。处理方式有三种默认动作开心拆快递自定义动作买了零食分给同学一些忽略不理快递基本结论识别信号是内核程序员内置的特性。信号产生前进程已经知道如何处理。信号处理不是立即的而是在合适的时候从内核态返回用户态时。信号到来 → 信号保存 → 信号处理。信号处理方式忽略 ; 默认 ; 自定义【后续都叫信号捕捉】快递到来的整个过程对你来说是异步的 你不确定 快递员什么时候会给你打电话1.2 键盘产生的信号MakefiletestSign:testSign.cc g -o $ $^ -stdc11 .PHONY:clean clean: rm -f testSigntestSig.cc#include iostream #include unistd.h int main() { int cnt 0; while (true) { std::cout hello world, cnt std::endl; sleep(1); } return 0; }ctrl c , 是给目标进程发送信号的 。 相当一部分的信号处理动作 就是让进程自己终止1.3 信号都有哪些kill -l 查看信号列表【数字大写的信号名】关键说明每个信号都有编号和宏定义名称如 2 号信号对应 SIGINT宏定义在signal.h头文件中34 及以上为实时信号用于实时进程通信日常开发主要使用 34 以下的常规信号每个信号都有默认处理动作可通过man 7 signal查看详细说明如 SIGKILL 的默认动作是终止进程且无法被捕捉和忽略。常用信号编号名称默认动作含义2SIGINT终止终端中断CtrlC3SIGQUIT终止Core Dump终端退出Ctrl\9SIGKILL终止强制终止不可捕捉、不可阻塞11SIGSEGV终止Core Dump段错误非法内存访问14SIGALRM终止闹钟信号20SIGTSTP停止进程终端停止CtrlZctrl c : 给目标进程发送 2信号 收到信号处理动作捕捉1.4 证明ctrlc - 二号信号修改一下testSig.cc的代码#include iostream #include unistd.h #include signal.h void handlerSig(int sig) { std::cout 获得了一个信号: sig std::endl; } int main() { signal(SIGINT,handlerSig); int cnt 0; while (true) { std::cout hello world, cnt std::endl; sleep(1); } return 0; }二、前台 后台进程2.1 现象查看2.2 核心定义特性前台进程 (Foreground)后台进程 (Background)标准输入✅ 独占键盘输入❌ 无法从 stdin 读取标准输出✅ 可以输出到终端✅ 可以输出到终端键盘信号✅ 响应 CtrlC 等❌ 不响应键盘信号数量限制必须只有一个可以有多个创建方式./program./program 前台进程唯一能接收键盘输入、获取标准输入的进程同一时间 Shell 中只能有一个前台进程。后台进程无法从键盘获取标准输入的进程同一时间可以有多个后台进程。Shell 命令行进程本身默认是前台进程负责接收用户输入的命令。2.3 为什么前台进程只能有一个键盘只有一个输入数据一定是给一个确定的进程的这是硬件层面的限制——键盘是独占设备。如果多个进程同时等待键盘输入操作系统无法决定把按键发给谁。因此 Shell 设计了作业控制Job Control机制前台作业当前与终端交互的进程组后台作业在后台运行不占用终端输入2.4 进程状态转换与作业控制命令命令作用示例jobs查看所有后台任务[1] Running ./test fg %n将后台任务 n 提到前台fg %1bg %n让暂停的后台任务继续运行bg %1CtrlZ暂停当前前台进程放入后台进程变为 StoppedCtrlC向前台进程发送 SIGINT 信号终止进程2.5 关键场景孤儿进程与后台化# 场景1正常前台进程 $ ./testsig # bash 子进程作为前台进程 # CtrlC 可以终止因为键盘信号发给前台进程 # 场景2后台运行 $ ./testsig # 立即放入后台 # CtrlC 杀不掉因为键盘信号只发给前台进程父进程先退出 → 孤儿进程自动后台化// 代码逻辑示意 int main() { if (fork() 0) { // 子进程 sleep(10); // 模拟工作 } else { // 父进程先退出 exit(0); } }现象父进程bash 的子进程先退出子进程变成孤儿进程被 init/systemd 收养自动提到后台因为失去了控制终端的前台关联CtrlC 杀不掉已经是后台进程

相关文章:

Linux进程信号详解(一):信号快速认识

一、信号快速认识信号(现实生活中):闹钟、红绿灯、上课铃声、狼烟、电话铃声、肚子叫、敲门声、脸色不好 ....1.1 生活中的信号 —— 快递的例子想象你网购了很多商品:你能识别快递:你知道快递员打电话时该怎么处理。即…...

Arduino驱动AY-3-8910 PSG芯片的轻量级音频库

1. 项目概述 MOS Electronics AY-3-8910 Library 是一个面向 Arduino 平台的轻量级驱动库,专为通用仪器(General Instrument)于1978年推出的经典可编程声音发生器(Programmable Sound Generator, PSG)芯片 AY-3-8910 …...

嵌入式差分升级技术解析与实践指南

1. 嵌入式差分升级方案概述在嵌入式设备固件更新领域,差分升级(Delta Update)已经成为解决传统OTA升级痛点的关键技术方案。作为一名长期从事嵌入式开发的工程师,我亲历过多次因固件体积过大导致的升级失败案例,直到采…...

SEO IP 地址对网站排名的重要性是什么

SEO IP 地址对网站排名的重要性是什么 在当前的互联网时代,网站排名直接关系到网站的流量和收益。作为网站运营者,我们都知道搜索引擎优化(SEO)是提升网站排名的关键。而在SEO的诸多因素中,IP地址的作用有时被忽视。S…...

嵌入式硬件设计核心架构与电源系统详解

1. 嵌入式硬件设计核心架构解析嵌入式系统的硬件架构就像一座精心设计的城市,CPU作为市长统筹全局,外围设备则是各个职能部门。这种架构最显著的特点就是硬件可裁剪性——我们可以根据实际需求灵活增删模块,就像城市规划中按需建设不同功能区…...

micro-moustache:嵌入式轻量模板引擎

1. micro-moustache:面向嵌入式系统的轻量级无逻辑模板处理器1.1 设计定位与工程价值micro-moustache 是专为资源受限微控制器(如 Arduino、ESP32、STM32 等)设计的极简 Mustache 模板引擎实现。其核心设计哲学是“功能够用、内存可控、接口直…...

LwEVT:嵌入式轻量级事件管理器设计与实践

1. LwEVT:嵌入式系统轻量级事件管理器深度解析 在资源受限的嵌入式系统中,事件驱动架构(Event-Driven Architecture, EDA)是构建高响应性、低耦合、可维护固件的核心范式。然而,传统RTOS内置的事件组(如Fre…...

嵌入式系统分层架构设计与驱动框架实现

1. 嵌入式系统中的分层架构设计在嵌入式开发领域,我一直坚持一个核心原则:好的代码结构应该像洋葱一样层次分明。以STM32开发为例,很多初学者直接从官方例程入手时,往往会发现应用层代码中混杂着大量硬件相关的头文件引用&#xf…...

python enum

## Python 中的 Any:一个被低估的类型注解工具 在 Python 的类型注解体系里,Any 是一个看似简单,却常常引发误解的特殊类型。很多开发者第一次见到它时,可能会觉得这不过是个“万金油”式的占位符,用来应付那些暂时不想…...

python namedtuple

## Python 中的 Any:一个被低估的类型注解工具 在 Python 的类型注解体系里,Any 是一个看似简单,却常常引发误解的特殊类型。很多开发者第一次见到它时,可能会觉得这不过是个“万金油”式的占位符,用来应付那些暂时不想…...

FreeRTOS消息队列原理与实战应用指南

1. FreeRTOS消息队列核心概念解析消息队列作为FreeRTOS中最核心的通信机制之一,其设计理念源于操作系统中的生产者-消费者模型。在实际嵌入式开发中,我经常用它来解决任务间的数据传递问题。与裸机编程中的全局变量共享不同,消息队列通过内核…...

DS1307实时时钟芯片驱动开发与工程实践指南

1. DS1307实时时钟芯片驱动技术深度解析DS1307是由Maxim Integrated(现为Analog Devices)推出的经典IC接口实时时钟(RTC)芯片,采用SOIC-8封装,工作电压范围2.0V–5.5V,支持-40C至85C工业级温度范…...

如何在浏览器中零安装使用GraphvizOnline创建专业流程图

如何在浏览器中零安装使用GraphvizOnline创建专业流程图 【免费下载链接】GraphvizOnline Lets Graphviz it online 项目地址: https://gitcode.com/gh_mirrors/gr/GraphvizOnline GraphvizOnline是一款革命性的在线可视化工具,让您无需安装任何软件即可在浏…...

TranslucentTB启动故障深度修复指南:从依赖解析到系统优化

TranslucentTB启动故障深度修复指南:从依赖解析到系统优化 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一…...

深蓝词库转换:跨输入法词库迁移与定制的一站式解决方案

深蓝词库转换:跨输入法词库迁移与定制的一站式解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 当输入法成为数字生活的"语言障碍" 李…...

AR1020触摸控制器驱动开发:嵌入式I²C/SPI底层集成指南

1. AR1020 触摸控制器驱动技术详解:面向嵌入式系统的底层实现与工程集成Microchip AR1020 是一款高精度、低功耗的单芯片电容式触摸控制器,专为工业人机界面(HMI)、医疗设备面板、车载信息娱乐系统及消费类电子产品的触控屏设计。…...

【花雕学编程】跨平台移植实战:在行空板K10上部署MimiClaw并与飞书深度整合

飞书是字节跳动开发的一站式企业协作平台,核心整合即时通讯、云文档、视频会议、日历和工作台五大模块。它以提升组织协同效率为核心,通过无限消息记录、实时多人文档编辑、智能会议纪要等特色功能,打造流畅的协作体验。平台提供丰富的开放AP…...

智能生态缸系统设计与实现:嵌入式Linux与Qt应用

1. 项目背景与需求分析在当代都市生活中,越来越多的人开始关注室内绿植养护。传统的生态缸管理方式存在诸多痛点:需要频繁人工干预、难以精准控制环境参数、缺乏实时监测手段等。这些问题直接影响了植物的生长状态和观赏价值。我们设计的智能生态缸系统正…...

RP2040硬件加速步进电机控制库picoasyncstepper

1. picoasyncstepper:面向RP2040平台的硬件加速异步步进电机控制库1.1 工程定位与核心价值picoasyncstepper 是一款专为 Raspberry Pi Pico 及兼容 RP2040 微控制器设计的轻量级、高精度步进电机驱动库。其根本设计目标并非简单实现“电机转动”,而是在极…...

Sodaq_R4X库详解:SARA-R4蜂窝模组嵌入式通信框架

1. Sodaq_R4X库深度解析:面向SARA-R4系列蜂窝模组的嵌入式通信框架1.1 库定位与工程价值Sodaq_R4X是一个专为u-blox SARA-R4系列蜂窝通信模组设计的Arduino兼容C库,其核心目标是将复杂的LTE-M(eMTC)、NB-IoT及2G(仅R41…...

【实战】手搓一个极简MCP服务,最后交给小龙虾调用

未来已来,只需一句指令,养龙虾专栏导航,持续更新ing… 一、MCP 协议核心概念 MCP(Model Context Protocol) 是由 Anthropic 提出的开放式 AI 模型工具连接标准,旨在解决 AI 模型与外部工具之间的标准化通信问题: 本质:基于 JSON-RPC 2.0 协议 构建的轻量级通信框架 核…...

STM32驱动SIM800C的硬件抽象层设计与实现

1. 项目概述ARCH_GPRS_V2_HW是基于 Seeed Studio 推出的 ARCH GPRS V2 硬件模块开发的一套底层驱动库,其原始设计源自官方提供的Arch GPRS HW DEMO工程。该库并非通用 AT 指令封装层,而是一套面向 STM32 平台(典型为 STM32F407VET6 或 STM32F…...

ENS220气压温度传感器超低功耗事件检测实战指南

1. 项目概述ScioSense ENS220 是一款面向超低功耗嵌入式应用的高精度气压与温度传感器,由奥地利半导体公司 ScioSense(原 ams AG 传感器事业部)设计制造。该器件采用 2.0 mm 2.0 mm 0.7 mm 超小型 LGA-8 封装,集成 MEMS 压阻式压…...

EthernetClientSecure深度指南:ESP32嵌入式TLS安全通信实战

1. EthernetClientSecure 库深度解析:面向嵌入式工程师的 TLS/SSL 安全以太网通信实践指南EthernetClientSecure 是一款专为 Arduino/ESP32 平台设计的轻量级、高可靠性安全以太网客户端库。它并非简单封装,而是通过精密的分层架构,在资源受限…...

STM8 Bootloader开发与固件远程升级实践

1. Bootloader的核心价值与应用场景在嵌入式产品开发中,Bootloader的重要性经常被低估。直到去年参与某工业控制器项目时,我才真正体会到它的价值——当时现场有200台设备需要紧急修复通信协议漏洞,但设备外壳采用防水密封设计,拆…...

VLCD车载LCD驱动框架:确定性刷新与跨SoC移植实践

1. VLCD库概述:面向CARIAD车载信息娱乐系统的TFT-LCD底层驱动框架VLCD(Virtual LCD)是一个专为大众集团CARIAD软件平台定制的轻量级、可移植TFT-LCD显示驱动抽象层。它并非通用图形库,而是聚焦于车载HMI(人机交互&…...

APDS9999传感器驱动开发:寄存器配置、中断与FreeRTOS集成

1. Arduino_APDS9999 库深度解析:面向嵌入式工程师的环境光、色彩与接近度传感器驱动开发指南APDS9999 是 Broadcom(原 Avago)推出的高集成度光学传感器芯片,集环境光感知(ALS)、RGB 色彩识别(C…...

Linux系统调用原理与性能优化实践

1. Linux系统调用基础概念在Linux系统中,系统调用是用户空间程序与内核交互的唯一合法途径。作为操作系统最基础的接口,它就像一扇严格管控的大门,既保护了内核的安全稳定,又为应用程序提供了必要的服务支持。为什么需要这种隔离机…...

2025届毕业生推荐的AI科研平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 使AIGC检测率得以降低的关键所在是去削弱文本具备的规律性以及模式化特性。具体的策略涵盖这…...

2025届最火的十大AI写作神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 降低AIGC也就是人工智能生成内容的痕迹,其关键要点在于,减少模式化表…...