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

【Linux系统】万字解析,进程间的信号

信号概念

信号是OS发送给进程的异步机制!所谓异步指的是,发送信息这个动作,并不会干扰进程本身!

对于信号的基本认识:

1.什么样的信号应该如何处理,是在信号产生之前早就得知了的

2.信号的处理并不是立即处理,而是等待合适的时间去处理

3.对于进程来说,其内部是以及内置了对于信号的识别以及处理方式

4.产生信号的方式很多,也就是说信号源非常多

信号的产生

信号的产生有很多方式

1.键盘产生信号

之前我们常见的:Ctrl + c就是信号,用于终止进程!

信号都有那些:

其中,我们只需要关注信号1~31(普通信号),信号的名字本身是,其真正的值就是前面的编号。

处理信号

进程收到信号之后,进程会在合适的时候,进程处理!其中处理的方式有三种

1.执行默认的处理动作!(相当一部分的信号默认动作都是终止进程)

2.执行自定义动作!

3.忽略信号,继续做自己的事!

自定义处理

代码语言:javascript

AI代码解释

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

代码语言:javascript

AI代码解释

#include <signal.h> #include <iostream> using namespace std; void sighandler(int i) { cout << "收到一个信号:" << i << endl; } int main() { // 将1~31的信号全部自定义 for (int i = 0; i < 32; i++) { signal(i, sighandler); } while (1) { } }

代码语言:javascript

AI代码解释

hyc@hyc-alicloud:~/linux/进程信号$ ./test ^C收到一个信号:2 ^C收到一个信号:2 ^C收到一个信号:2 ^C收到一个信号:2 ^C收到一个信号:2

可以看到,我们发送了多次的Ctrl + c信号,可见Ctrl + c信号发送的就是2号信号:SIGINT

当然并不是说有的信号都可以被自定义,那不然进程就无法停止了!

前后台

当我们运行可执行程序时,我们发现Linux指令不起作用了?!这就是前后台的问题了

在OS中,进程分为:前台进程、后台进程

前台进程:有且仅有一个!并且只有前台进程才能接收输入的数据!

后台进程:可以有多个!

虽然输入的数据只有前台进程可以接收,但是输出的数据可以由前后台共同进行的!

所以,当我们运行我们的程序时,当前这个程序就处于前台了!那么负责接收解析指令的shell程序就会退出前台!而后台程序是不能接收输入进来的数据的,所以这才导致我们输入的指令没有反应!

发送信号的本质

信号发送给进程后,进程需要在合适的时间再进行处理!那么这就意味着进程需要先将信号保存下来!后续再读取执行。

那么保存在哪里呢?答案是保存在task_struct的sigs变量中!其中sigs采用的是位图结构比特位的位置表示信号的编号比特位的内容(1表示收到、0表示没有收到)表示是否收到

所以,发送信号的本质就是,向目标进程写信号 -> 修改位图!

但是task_struct中的数据属于OS内核数据!所以想要修改其数据,就只能让OS自己来修改!所以信号只能让OS来发送!

2.系统调用产生信号
kill接口

代码语言:javascript

AI代码解释

#include <signal.h> int kill(pid_t pid, int sig); 作用:向指定的进程发送信号! pid 参数: pid > 0:向指定进程 ID 的进程发送信号 pid = 0:向与调用进程同进程组的所有进程发送信号 sig 参数: 代表信号编号

看看效果:

代码语言:javascript

AI代码解释

#include <signal.h> #include <sys/types.h> #include <unistd.h> #include <iostream> using namespace std; void sighandler(int i) { cout << "收到一个信号:" << i << endl; } int main() { // 将1~31的信号全部自定义 for (int i = 0; i < 32; i++) { signal(i, sighandler); } kill(getpid(), 2); }

也可以通过kill来验证一下,上面说的“并不是所有信号都可以被自定义!”

代码语言:javascript

AI代码解释

#include <signal.h> #include <sys/types.h> #include <unistd.h> #include <iostream> using namespace std; void sighandler(int i) { cout << "收到一个信号:" << i << endl; } int main() { // 将1~31的信号全部自定义 for (int i = 0; i < 32; i++) { signal(i, sighandler); } for (int i = 1; i < 32; i++) { kill(getpid(), i); } }

可见,信号9并不能被“自定义”!当然不仅仅编号9,还有其他信号也不能被自定义。

http://www.jsqmd.com/news/490244/

相关文章:

  • 正德会计服务质量如何,专业团队保障审计结果? - mypinpai
  • Phi-3-vision-128k-instruct开发者案例:跨境电商多语言商品图理解
  • FLUX.1游戏开发:Unity插件实现场景自动生成
  • Qwen3-14b_int4_awq性能实测报告:吞吐量、首token延迟、e2e响应时间分析
  • 家人们谁懂啊
  • Phi-3-vision-128k-instruct效果展示:实验室设备图→操作规范+安全风险+维护周期
  • 突破网络限制的小说下载解决方案:Tomato-Novel-Downloader全平台离线阅读方案
  • Lumafly:实现模组无缝管理的跨平台解决方案 - 空洞骑士玩家的效率提升工具
  • AI头像生成器实战案例:为小红书/微信/B站定制风格化头像的完整方案
  • 盒马鲜生购物卡回收避坑指南:这 5 个坑千万别踩! - 团团收购物卡回收
  • Qwen3-14b_int4_awq教程升级:支持Streaming输出、历史会话与上下文管理
  • 新手零基础入门:借助快马AI一键生成可运行的worldmonitor数据获取项目
  • BalenaEtcher镜像烧录工具Mac下载异常深度修复指南
  • 从高阶耦合到解耦控制:LCL型三相PWM整流器建模与坐标变换实践
  • 2026年北京小程序开发公司怎么选?附带联系方式 - 品牌2025
  • EcomGPT-中英文-7B电商模型Ubuntu 20.04一键部署与运维指南
  • 睿尔曼超轻量仿人机械臂与云迹底盘集成实战:AGV复合机器人开发指南
  • macrodroid在小米14安卓手机上的效果,像是ios的快捷指令的镜像
  • UNIT-00模型在AIGC内容安全审核中的应用实践
  • 农业IoT设备资源受限?Docker 27 Slim镜像技术实测:将TensorFlow Lite推理容器压缩至12.3MB,启动提速4.8倍!
  • Qwen3-14B惊艳效果:用int4模型生成带Mermaid图的系统架构说明文档
  • 手把手教你用Buildroot+QEMU在Ubuntu24.04上构建嵌入式Linux系统
  • 深度解析 InsForge:专为 AI Agent 打造的全栈后端基础设施
  • 优化C#异步编程:深入理解ConfigureAwait(false)的适用场景与陷阱
  • 从字节流到弹幕消息:抖音Protobuf协议逆向全流程拆解
  • 计算机毕业设计springboot报刊厅实体书刊订购系统 基于SpringBoot的期刊杂志实体书在线采购平台 基于SpringBoot的报刊亭纸质图书订购管理系统
  • 推荐一家北京小程序开发的公司,附带联系方式 - 品牌2025
  • MinerU智能文档理解服务部署教程:一键启动,快速搭建私有文档解析服务
  • 马斯克又挖了两位天才少年
  • 手把手教你用Emotion-LLaMA搭建多模态情感分析系统(附Python实战代码)