跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

Linux 信号入门:进程通信机制与实战应用

介绍 Linux 系统中信号的概念、分类及发送方式。信号是进程间即时通信的核心机制,可通过 kill、raise、abort 等系统调用或硬件异常触发。文章详细讲解了信号的处理函数注册、默认行为及实时信号与普通信号的区别,并简述了操作系统内核通过修改 task_struct 处理信号的底层原理,帮助开发者理解信号在进程控制中的应用。

竹影清风发布于 2026/3/23更新于 2026/10/196.8K 浏览
Linux 信号入门:进程通信机制与实战应用

信号初识

什么是信号

信号用来给某个进程直接传达的命令,因此信号的发出对象为操作系统。

按照理论,被接收信号的进程可以选择:

  • 默认执行:直接按照信号的实现方法默认执行
  • 不执行:选择无视信号
  • 自定义执行:不顾具体的信号实行方法,自己按自己的方法实行
查看信号

可以执行下面的命令查看所有的信号:可明显发现数字序号和对应的大写字符串其实是宏实现的。

kill -l

其中:131 号信号为普通信号,3464 号信号为实时信号(暂时不了解)。

('Ctrl+C'在我们进程死循环时可以强制退出,它对应的实现是 2 号信号)

在 Linux 中,会存在前台进程和后台进程:

  • 前台进程:直接展现给用户的(默认打开的是 bash 进程),每次登录只能允许一个前台进程存在
  • 后台进程:隐藏起来执行的进程
补充:数据输入输出流程

我们知道操作系统和硬件之间夹着驱动程序,键盘输入时对应的驱动程序会发生中断请求给 CPU,CPU 接到请求知道了有数据需要从键盘读取,它会让操作系统拿数据到对应缓冲区,待操作系统有时间处理(感觉就是进入运行队列!)就会刷新到显示器文件,显示器拿到了数据。

发送信号

在学习发生信号的方式之前,我们需要先看一下另一个接口:signal()

(注意:**9 号信号'强制终止'和19 号信号'强制暂停'**是无法被替换执行方法的)

#include <signal.h> // 信号处理函数类型定义(参数为信号编号) typedef void (*sighandler_t)(int); // 注册信号处理函数 sighandler_t signal(int signum, sighandler_t handler);

参数:

  • 第一个参数:信号
  • 第二个参数:函数指针(用来自定义一个函数作为参数)

作用:执行该接口后,该信号默认执行方法失效,捕捉该信号执行自定义执行方法(即该函数)。当捕捉到 2 号信号,也就意味着原来 2 号信号的执行方法将不再生效!

指令发送

指令发送即执行:指令发送我们就不多谈了,实行 kill 指令与选项即可。

kill -序号 进程 ID
键盘触发

比如:Ctrl+C(对应 2 号信号)、Ctrl+\(对应 3 号信号)

系统调用

下面介绍三个可以发送信号的系统调用接口:你会发现最后两个接口都可以通过 kill() 实现!

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

参数:

  • 第一个参数:目标进程
  • 第二个参数:要发送的信号编号

返回值:

  • 成功:返回 0;
  • 失败:返回 -1,并设置 errno

作用:给指定进程发送对应的信号

raise()
#include <signal.h>
int raise(int sig);

参数:信号编号

返回值:

  • 成功:返回 0;
  • 失败:返回非 0(设置 errno)

作用:向正在运行的(即调用该函数的进程)进程发送信号

abort()
#include <stdlib.h>
void abort(void);

参数:无

返回值:无

作用:触发程序的异常退出(发送 6 号 SIGABRT 信号)

异常(硬件发送)

比如代码中出现除 0 错误,对空指针解引用....下面我们来梳理该类错误的产生过程:

CPU 中会存在程序计数器(比如 PC 指针)用来找到下一行代码(不会干扰其它进程),当 CPU 知道下一句代码指令是违规的(可能是语法规定有被解析到),就会暂停执行代码,告诉操作系统错误情况(比如错误位置、原因等等),操作系统拿到 CPU 的反馈错误后再通过信号向该进程发送,用户再通过提示知道错误信息,一般出现信号错误都是很严重的错误,进程会终止,但是在大型的服务器上,会循序重新执行程序,只给你报错误信息!

了解即可:错误信息其实是被保存在 core dump 文件(这个是需要手动开启)

难道异常都是由硬件发出吗?当然不是软件也可以,请继续向下看:

信号(软件发送)

以 alarm() 函数为例:给当前程序定一个闹钟(到时发送 SIGALRM-14 号信号)

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

参数:设置的秒数(比如 5 秒,seconds=5)

返回值:上一次设置的定时器剩余的秒数(混淆点)比如:

第一个 alarm() 函数的返回值应该是 0,因为它之前没有闹钟

如果有多个 alarm():前一次调用 alarm 设置的定时器'还没到期'(还没触发 SIGALRM 信号)时,再次调用 alarm。就会覆盖前面的秒数直接执行当前 alarm()。

例如:我先设置一个闹钟,alarm(20),然后观察返回值以及验证是否发送的是 14 号信号:

结果:我发送了两次 14 号信号,被正常捕捉没有问题。但是 20 秒后闹钟响了又被捕捉到了

下面验证如果存在多个 alarm(),是否会覆盖旧的闹钟秒数:

操作系统内部处理

操作系统给这个进程发信号,实质是修改 task_struct 中的 int signal 参数:

目录

  1. 信号初识
  2. 什么是信号
  3. 查看信号
  4. 补充:数据输入输出流程
  5. 发送信号
  6. 指令发送
  7. 键盘触发
  8. 系统调用
  9. kill()
  10. raise()
  11. abort()
  12. 异常(硬件发送)
  13. 信号(软件发送)
  14. 操作系统内部处理

更多推荐文章

查看全部
  • LeetCode 62. 不同路径
  • C++ 数据结构:哈希表原理与 STL 实现详解
  • AI 无人机智慧巡检平台架构与功能解析
  • 归并排序与数组逆序对:分治算法实战解析
  • Java 核心面试知识点梳理与实战解析
  • Java Servlet 过滤器实现敏感字符过滤
  • RabbitMQ 分布式系统实战:从安装部署到 C++ 客户端调用
  • 无人机视角山区泥石流与滑坡图像识别数据集
  • 2024 年 AI 视频生成项目盘点:102 个精选
  • LLaMA-Factory 详细安装教程
  • Java 大数据在智能家居能源消耗趋势预测与节能策略优化中的应用
  • 大语言模型(LLM)原理与 LoRA 微调实战
  • WebAssembly 技术全景解析:核心机制与应用场景
  • VSCode Copilot 接入智谱 GLM-4.6 配置指南
  • 万方AIGC检测通不过?这几款降AI工具实测有效
  • LLaMA 论文核心内容解读
  • OpenClaw 免费 AI 大模型及配置方法
  • 基于 Spring Boot 的 Web 三大核心交互案例详解
  • llama.cpp 多 GPU 分布式计算优化实践指南
  • 2026我为什么开始用 Megick:一个更轻量、更顺手的 AI 创作工作台

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online