[linux仓库]信号快速认识[进程信号·壹]

[linux仓库]信号快速认识[进程信号·壹]


🌟 各位看官好,我是egoist2023

🌍 Linux == Linux is not Unix !


🚀 今天来学习Linux的进程信号,从生活例子过度到理论,从而朴素认识信号。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享更多人哦!

目录

对信号产生共识

理解ctrl + c

信号概念

查看信号

信号处理

一个系统函数

前台进程 vs 后台进程

朴素认识信号本质

总结


对信号产生共识

接下来小编会从时间维度上对信号产生、信号保存以及信号处理进行解答,但是这都是需要基于对信号的理解.而我们连信号是什么都不知道,因此在此需要先对信号产生一定的共识,再来对上图进行剖析.

那么什么是信号?拿生活中来举例:

现实世界 -->信号概念是什么? -->红绿灯,闹钟,狼烟…

并且我们在过马路时知道红灯停、绿灯行;在闹钟还没到来时我们就知道这个闹钟到点了就该起床了.在还没有产生信号的时候,我们就知道信号产生的时候,该如何处理! --> 意味着我能识别这些信号, --> 我为何能识别这些信号?被教育过 --> 记住了

 信号特征 + 信号处理方法 --> 反推回来我能识别这些信号

那么进程是如何识别信号的?进程和信号都是程序员写的,实际上进程内部已经内置了对于信号的识别和处理机制!!!

为什么要有信号呢? --> 作用:信息事件的通知 --> 信号产生,是异步产生的

生活例子:张三和李四在联机玩王者农药,此时张三的母亲让张三10点的时候去大厅打扫下卫生,张三说好的.可是到10点的时候,张三这把游戏还没结束,此时跟母亲说:等我打完这把游戏就去打扫.

因此,信号到来的时候,如果我在做更重要的事情,收到信号的时候,可以不立即处理信号(通过简单通知机制,告诉人,应该要做什么了) --> 在合适的时候处理 -->这也要求我们把这个信号记录下来!!!

那么该如何处理信号呢? 

理解ctrl + c

还记得平日最常使用的 ctrl + c? 我们的进程是可以被终止的.

用户输⼊命令,在Shell下启动⼀个前台进程;
用户按下 Ctrl+C ,这个键盘输⼊产⽣⼀个硬件中断,被OS获取,解释成信号,发送给⽬标前台进程;

前台进程因为收到信号,进⽽引起进程退出;
ctrl + c 的本质 : 向目标进程发送2号信号!

信号概念

查看信号

信号是进程之间事件异步通知的⼀种⽅式,属于软中断。

在Action中 Core 和 Term 都是终止进程,一般这两是没区别的,但有一些特殊情况会有区分. 

信号处理

一个系统函数

如何证明呢?


修改进程对信号的处理动作:

ctrl + c 实际是向目标进程发送 2 号信号,那么我只要修改目标进程对 2 号处理动作来证明确实 ctrl + c 确实是向目标进程发送信号即可! 

 signal(SIGINT/*2*/, SIG_DFL); // 默认对2号信号的处理 while (true) { std::cout << "我是一个进程: " << getpid() << std::endl; sleep(1); }

将进程对信号的处理改成忽略后:会发现我们的进程无法终止了啊!

 signal(SIGINT/*2*/, SIG_IGN); // 忽略对2号信号的处理 while (true) { std::cout << "我是一个进程: " << getpid() << std::endl; sleep(1); }

 

那么该如何终止呢?使用 kill 命令 或 ctrl + \

自定义处理该信号:提供⼀个信号处理函数,要求内核在处理该信号时切换到用户态执⾏这个处理函数,这种⽅式称为自定义捕捉(catch)一个信号.

signal注册,只需要注册一次。未来如果收不到该信号,对应的动作,就不会执行.

此时一直在while循环体里执行,此时 ctrl + c 向目标进程发送 2号 信号,会跳到自定义捕捉方法执行handler函数.

// int signo: 进程收到了哪一个信号的编号,会传递给handler方法 void handler(int signo) { std::cout << "我这个进程: " << getpid() << ", 抓到了一个信号: " << signo << std::endl; // 我没有在这个函数里终止进程哦! } int main() { // signal注册,只需要注册一次。未来如果收不到该信号,对应的动作,就不会执行 signal(2, handler); // signal {... handler(2) ...} while (true) { std::cout << "我是一个进程: " << getpid() << std::endl; sleep(1); } }
产生信号的方式:

结论1 : 键盘可以向目标进程发送信号!如ctrl+\:向目标进程发送3信号

结论2 : kil命令向目标进程发送信号!
signal函数仅仅是设置了特定信号的捕捉⾏为处理⽅式,并不是直接调用处理动作。如果后续特定信号没有产⽣,设置的捕捉函数永远也不会被调⽤!Ctrl-C 产⽣的信号只能发给前台进程。⼀个命令后⾯加个&可以放到后台运⾏,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。Shell可以同时运⾏⼀个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C这种控制键产⽣的信号。前台进程在运⾏过程中用户随时可能按下 Ctrl-C ⽽产⽣⼀个信号,也就是说该进程的用户空间代码执⾏到任何地⽅都有可能收到 SIGINT 信号⽽终⽌,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。可以渗透 & 和 nohup

前台进程 vs 后台进程

在终端中启动进程时,在命令后添加 & 符号,进程会直接在后台运行:

为什么无法终止呢?这里必须先理解前台和后台才能理解:

这就是为什么fork()之后,父进程退出,子进程仍在运行 ->孤儿进程 -->1号进程领养 ->子进程自己会变成后台进程,此时ctrl + c 时后台并不能从键盘获取数据,因此无法ctrl +c终止的原因.

int main() { if(fork() > 0) exit(0); while (true) { std::cout << "我是一个进程: " << getpid() << std::endl; sleep(1); } }

朴素认识信号本质

总结

本文介绍了Linux信号机制的基本概念和工作原理。信号是进程间异步事件通知的一种软中断方式,类似于生活中的红绿灯、闹钟等通知机制。作者通过Ctrl+C终止进程的例子,说明2号信号SIGINT的默认处理方式是终止进程,并演示了如何通过signal()函数修改信号处理行为(默认、忽略或自定义)。文章还解释了前台进程和后台进程的区别,以及为什么后台进程无法通过Ctrl+C终止。最后指出信号处理是异步的,内核会在收到信号后切换到用户态执行注册的处理函数。

Read more

AI时代的技术民主化:为什么文科生可能成为最大受益者?

AI时代的技术民主化:为什么文科生可能成为最大受益者?

✨道路是曲折的,前途是光明的! 📝 专注C/C++、Linux编程与人工智能领域,分享学习笔记! 🌟 感谢各位小伙伴的长期陪伴与支持,欢迎文末添加好友一起交流! 当技术门槛被无限降低,真正有价值的不再是"怎么写代码",而是"想做什么" 01 一个被忽视的趋势 过去一年,我观察到一个有趣的现象:那些在AI浪潮中赚得盆满钵满的人,并不是技术背景最深厚的那批。 相反,他们中有学中文的、学设计的、学市场营销的。他们有一个共同特点——擅长理解人,擅长讲故事,擅长发现需求。 而这,恰恰是AI目前做不到的。 02 从"技术壁垒"到"创意壁垒" 传统开发流程 vs AI辅助流程 让我们看看传统的产品开发流程与现在的对比: 关键洞察:传统模式下,"想法&

By Ne0inhk
LLM -Awesome OpenClaw Skills:给本地 AI 助手装一个「超级插件市场」

LLM -Awesome OpenClaw Skills:给本地 AI 助手装一个「超级插件市场」

文章目录 * 一、OpenClaw 是什么,它为什么需要「技能」 * 二、这个仓库到底包含什么 * 2.1 仓库定位:精挑细选的技能清单 * 2.2 技能协议:遵守 Anthropic 的 Agent Skill 规范 * 三、OpenClaw 技能怎么安装和使用 * 3.1 官方推荐:用 ClawHub CLI 一键安装 * 3.2 手动安装:适合喜欢掌控一切的开发者 * 3.3 最偷懒的方式:在对话里直接贴技能仓库链接 * 四、这个列表为什么存在:解决「技能过载」问题 * 4.1 ClawHub 的问题:量太大,但质量参差不齐

By Ne0inhk
【AI应用开发工程师】-AI写代码总翻车?一文帮你解决(附实战案例)

【AI应用开发工程师】-AI写代码总翻车?一文帮你解决(附实战案例)

AI 写代码不按需求来?这个需求对齐 Skill 让你告别返工! 引言 你是不是也遇到过这种情况:兴冲冲地给 AI 提了个需求,结果它生成的代码完全跑偏,就像你点了一份红烧肉,端上来的却是番茄炒蛋?别急,这很可能不是 AI 的锅,而是需求没对齐!今天,我就来安利一个神器—— 需求对齐 Skill 。 目录 * 什么是需求对齐模式? * 核心原则:三大“只”字诀 * 执行流程:三步搞定需求确认 * 实际示例:视频提示词修改功能 * 如何应用这个 Skill? * 结语:一起告别返工! 什么是需求对齐模式? 简单说,这是一种让 AI“先理解,后动手”的交互模式。在没有这个 Skill 之前,每次提新需求都得和 AI“聊半天”,还经常返工。

By Ne0inhk
本地离线部署AI大模型:OpenClaw + Ollama + Qwen3.5:cloud/Qwen3:0.6b 超详细教程(无需GPU)

本地离线部署AI大模型:OpenClaw + Ollama + Qwen3.5:cloud/Qwen3:0.6b 超详细教程(无需GPU)

前言 随着开源大模型越来越成熟,我们完全可以在自己电脑上本地运行AI,不联网、不上传数据、免费使用,隐私性极强。 今天这篇文章,我会一步步带你完成:Ollama + Qwen3.5:cloud(主力模型)+ Qwen3:0.6b(轻量备选)+ OpenClaw 的本地部署,实现一个属于自己的本地聊天AI,兼顾效果与低配置适配。 一、项目介绍 本项目实现本地离线运行阿里通义千问系列大模型(Qwen3.5:cloud 主力模型 + Qwen3:0.6b 轻量备选模型),全程不需要云端API,不需要高性能显卡,普通电脑就能跑,可根据自身电脑配置选择对应模型。 用到的工具: * Ollama:最简单的本地大模型管理工具,一键拉取、运行、管理模型 * Qwen3.5:cloud:阿里云开源的轻量高性能大语言模型,对话效果强、适配本地部署,作为主力使用

By Ne0inhk