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

Linux 进程信号机制入门:从概念到实践

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

PgDevote发布于 2026/3/16更新于 2026/7/642 浏览
Linux 进程信号机制入门:从概念到实践

对信号产生共识

文章配图

接下来将从时间维度上对信号产生、信号保存以及信号处理进行解答,但这些都是基于对信号的理解。首先需要建立对信号的共识。

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

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

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

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

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

文章配图

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

生活例子:张三和李四在联机玩王者农药,此时张三的母亲让张三 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 : kill 命令向目标进程发送信号!

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);
    }
}

朴素认识信号本质

文章配图

目录

  1. 对信号产生共识
  2. 理解 ctrl + c
  3. 信号概念
  4. 查看信号
  5. 信号处理
  6. 一个系统函数
  7. 前台进程 vs 后台进程
  8. 朴素认识信号本质
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Slack 机器人集成 IndexTTS 发送语音消息提醒
  • C++模板与泛型编程:构建灵活代码架构
  • @anthropic-ai/claude-code 快速上手指南
  • OpenClaw 飞书机器人部署记录
  • AI 产品经理面试核心问题与实战解答指南
  • OpenCV 调整图像对比度与亮度的方法
  • Figma + Claude + Weavy AI:构建高效 UI 设计工作流
  • 直流无刷电机 FOC 控制算法详解与 STM32 实现
  • 分治归并排序核心原理及 LeetCode 实战
  • Emotion2Vec+ Large 语音情感识别 WebUI 界面优化实战
  • Python 启动器 py.exe 功能与使用指南
  • 基于 LlamaIndex 实现 Agent 智能体
  • 世界职业院校技能大赛人工智能赛道解析
  • FLUX.1-dev FP8 模型部署与低显存优化实战
  • 深度学习模型优化策略与实战调参
  • C++ Lambda 表达式详解
  • 移动前端开发与 Web 前端开发的区别
  • 基于 Spark 与 Django 的电影票房预测及推荐系统
  • MySQL 内置函数实战:日期、字符串与数学处理
  • Android Studio 将字符串写入本地文件的操作方法

相关免费在线工具

  • 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