别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)

合集 · 直观理解计算机技术【CoreDumped】 (68)

  1. 11:03
    代码中指定变量类型为何如此重要?
  2. 13:46
    栈为何如此之快?
  3. 17:53
    堆为何如此之慢?
  4. 19:56
    动态数组的内部机制(ArrayList VS LinkedList)
  5. 15:37
    探索计算机并发与多任务处理的历史
  6. 12:54
    晶体管是如何运行代码的?
  7. 16:12
    晶体管是如何记忆数据的?
  8. 18:47
    制作一个CPU来运行程序
  9. 11:23
    计算机如何将字符串转换为数字
  10. 17:18
    动态随机存取存储器(DRAM)的工作原理
  11. 16:05
    计算机处理器是如何运行条件和循环的?
  12. 6:51
    一个程序不是一个进程
  13. 14:52
    深入理解进程,如何进行上下文切换?计算机科学中最深刻和最成功的想法之一。
  14. 20:20
    处理器内部的单个位如何保护操作系统的完整性?
  15. 13:14
    计算的心跳:时钟如何推动 CPU 前进?
  16. 14:22
    英语原声版-计算的心跳:时钟如何推动 CPU 前进?
  17. 14:15
    (英语原声)进程间通信:共享内存或发送消息
  18. 12:29
    (中文配音)进程间通信:共享内存或发送消息
  19. 14:59
    (中文配音)为什么单核处理器需要线程?
  20. 16:07
    (英语原声)为什么单核处理器需要线程?
  21. 9:26
    (中文配音)多核系统上的线程
  22. 11:27
    (英语原声)多核系统上的线程
  23. 11:52
    (中文配音)为什么应用程序是特定于操作系统的?
  24. 13:09
    (英语原声)为什么应用程序是特定于操作系统的?
  25. 13:15
    (英语原声)硬件如何在多任务处理中协助软件?
  26. 11:29
    (中文配音)硬件如何在多任务处理中协助软件?
  27. 20:34
    链表的一个实际应用
  28. 45:02
    让你的电脑运行更流畅的奇妙算法
  29. 43:38
    (流畅中文配音)让你的电脑运行更流畅的奇妙算法
  30. 19:41
    (原声双语字幕)当程序调用 sleep() 时会发生什么?
  31. 17:57
    (流畅中文配音)当程序调用 sleep() 时会发生什么?
  32. 20:40
    这个简单算法驱动了真正的解释器:Pratt Parsing
  33. 18:19
    (双语字幕)编程中最难以捉摸的Bug:竞态条件
  34. 19:23
    (流畅中文配音)编程中最难以捉摸的Bug:竞态条件
  35. 16:02
    (中文配音)阻止内存攻击的底层电路
  36. 14:51
    (英语原声)阻止内存攻击的底层电路
  37. 18:04
    为什么有些项目会使用多种编程语言?
  38. 19:32
    为什么有些项目会使用多种编程语言?
  39. 17:15
    别再杀进程了!让 Ctrl+C 变成“喵”……(用信号实现)
  40. 19:23
    别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
  41. 19:05
    80 年代避免竞态条件的算法(以及它为何失败)
  42. 19:43
    80 年代避免竞态条件的算法(以及它为何失败)
  43. 22:10
    CPU如何与众多不同设备交互?
  44. 23:52
    (中文配音)CPU如何与众多不同设备交互?
  45. 14:04
    (中文配音)你每天都在用的奇特CPU操作
  46. 13:04
    你每天都在用的奇特CPU操作
  47. 18:04
    (中文配音)历史如何塑造了我们今天仍在使用的编程术语?
  48. 17:42
    (英语原声)历史如何塑造了我们今天仍在使用的编程术语?
  49. 16:41
    为什么有些底层项目里会充满这种奇怪的代码?
  50. 16:39
    (中文配音)为什么有些底层项目里会充满这种奇怪的代码?
  51. 21:35
    编译与解释代码如何共处同一程序中?
  52. 21:30
    (英语原声)编译与解释代码如何共处同一程序中?
  53. 17:09
    【双语字幕】Core Dumped 常见问题的集中回答
  54. 13:36
    【双语字幕】90年代的设计决策阻碍了Python并行化
  55. 12:01
    【中文配音】90年代的设计决策阻碍了Python并行化
  56. 17:51
    Linux创建进程的奇怪方式
  57. 18:14
    【中文配音】Linux创建进程的奇怪方式
  58. 19:49
    CPU如何运行函数?
  59. 19:38
    【中文配音】CPU如何运行函数?
  60. 17:15
    没有人解释的问题:内核的边界在哪里?
  61. 19:36
    【英语原声】没有人解释的问题:内核的边界在哪里?
  62. 35:49
    硬件如何让线程问题不再那么棘手?
  63. 19:47
    为什么在macOS、Windows和Linux上安装应用程序如此不同?
  64. 24:00
    游戏公司真的能破坏你的电脑吗?
  65. 10:43
    一个视频说透“架构”:为什么你的程序换个CPU就可能跑不了?
  66. 14:45
    CPU如何执行有符号和无符号运算?
  67. 19:11
    简单指令, 奇妙算法
  68. 9:26
    当CPU遇到它不认识的指令,会发生什么?😱【底层原理】
Description
https://www.youtube.com/watch?v=m6WXrC9Mxzo
视频提到的代码地址:https://github.com/jdvillal/program_a
视频核心总结
Ctrl+C 的默认行为
在终端运行程序时,按下 Ctrl+C 会向该进程发送一个 SIGINT(中断信号)。
默认情况下,这会立即终止进程,相当于“杀掉”程序。
信号的概念
信号是 Unix/Linux 系统中一种低层进程间通信机制,不依赖共享内存或显式消息传递。
信号是一个简单的事件通知,例如 SIGINT(中断)、SIGTERM(终止)、SIGKILL(强杀)、SIGUSR1/2(用户自定义)等。
信号只告诉进程“发生了某件事”,不传递复杂数据。
类比说明
视频用交通灯和汽车喇叭作比喻:你不会发邮件或下车跟前车司机解释,只是按喇叭,告诉对方“该走了”。
信号就像喇叭:短小、直接,只是通知事件发生。
捕获与处理信号
可以用编程方式捕获信号(signal handling),在收到信号时执行自定义动作,而不是让系统执行默认行为。
例如,拦截 SIGINT 信号,让 Ctrl+C 不结束程序,而是输出“喵~”、保存数据、打印状态等。
实现方法(示例语言是 Python)
使用 signal 模块注册一个处理函数 signal.signal(signal.SIGINT, handler)。
当用户按下 Ctrl+C,handler 会被调用,执行自定义逻辑。
这样可以让程序优雅退出、记录日志,甚至仅仅做个有趣的动作。
应用场景
优雅关闭长时间运行的程序(如服务器、数据采集、实验脚本)。
提供调试信息而不终止进程。
制作有趣的终端互动效果。
相关标签
 #信号处理 #Linux编程 #进程通信 #CtrlC #SIGINT #系统编程 #Python信号 #Shell终端 #进程控制

Comments

密度先生 2025-08-16

一想到这些视频是用PPT做的就惊奇[吃瓜]

♥ 110 ↩ 8

Cath 2025-08-15

试过进程锁死,CtrlC都干不掉

♥ 69 ↩ 12

Void_Deer 2025-08-16

好标题,既吸引人也有简要实现方法,不明白的会被吸引进来、已经明白的看一眼标题就知道自己可以不用浪费时间。赞 以及,感谢烤肉!

♥ 48 ↩ 1

创作中心 2025-08-15

signal甚至可以用于进程间传递数据,例如前几年某道CTF比赛题目: https://github.com/USTC-Hackergame/hackergame2022-writeups/blob/master/official/%E7%9C%8B%E4%B8%8D%E8%A7%81%E7%9A%84%E5%BD%BC%E6%96%B9/README.md

♥ 46

TCY-Vilert 2025-08-16

Ctrl+Break:我被遗忘了?

♥ 45 ↩ 21

nic0nicon1 2025-08-22

拦截 SIGINT 常用于实现自定义的退出行为,最常见的一种约定是按一次 C-c 正常退出,按两次 C-c 强制退出,大量程序都在用。yum 曾经还有按一次 C-c 就换镜像服务器地址重新下载的约定,非常好用,如果被分配到一个坏服务器下载很慢,按 C-c 可以不取消下载而立刻换一台服务器,可惜 dnf 时代这功能没了。

♥ 16

AI视频总结 2025-08-15

AI课代表总结: 你以为Ctrl+C只是结束进程的快捷键?其实它本质是向进程发送SIGINT信号的优雅退出方式。本篇带你走进Linux信号机制的世界:进程间无需共享内存,也不依赖复杂通信,只需一个轻量级“信号”就能实现异步通知。 从交通灯前的喇叭比喻出发,揭示信号的核心作用——轻量级异步提醒,专用于中断、暂停或终止操作。通过实践`kill()`与`signal()`函数,我们让进程A在接收到SIGUSR1时不仅不崩溃,反而继续正常运行,表现如常。更有趣的是,将Ctrl+C重定义为“喵~”音效——只要注册自定义信号处理器,按下一次Ctrl+C,程序不会退出,而是播放一段猫叫声!趣味十足,学习效果加倍。 深入机制:终端驱动捕获Ctrl+C,转化为向前台进程组广播SIGINT;而看似“可忽略”的信号,实则暗藏杀招——`SIGKILL(9)` 和 `SIGSTOP(19)`,无论怎样处理,都无法被忽略,强制终止或暂停,毫无例外。 同时介绍进程组概念:使用`kill -n pid`可向整个进程组发送信号;实战中,`kill -18` 可恢复因Ctrl+Z暂停的任务,真正掌握终端控制的艺术。 关键提醒:尽管理论上可以捕获`SIGSEGV`(段错误),但一旦发生非法内存访问,即使设置了信号处理器也无济于事——此时地址空间已损坏,系统早已准备“核心转储”,无法挽回。 结语:信号不是闲聊,而是系统对程序生命周期的精准调控。它让操作系统能高效干预程序行为,无需复杂IPC机制。正如作者所言:“操作系统并非主动终止程序,而是递送一封带有提示的‘快递’。” > 核心启示: > ✅ Ctrl+C = 快速触发SIGINT信号 > 🐱 自定义信号处理器 = 将终止变为“喵呜” > 🔥 SIGKILL / SIGSTOP = 不可规避的强力指令 > ⚠️ 捕获错误信号 → 可能引发竞态与安全隐患 > 💡 推荐进阶:Randal Bryant《CSAPP》第8章,深入理解底层机制! 别再盲目终止进程——学会掌控信号,你便握住了系统的操作钥匙。 --内容由@A

♥ 16

hll_RGB 2025-08-15

论杀进程能力是SIGSEGV能杀还是SIGKILL能杀[doge]

♥ 10 ↩ 3

水洼里的纸片鱼 2025-08-18

学会了,这就去卡死oj的测评机

♥ 8 ↩ 1

吉他是只猫 2025-08-16

给段错误信号加回调函数居然是错误的方法吗?当前公司开发的项目中好几个程序都是这样写的,我还见过视频中说的异常现象——崩溃的过程中又触发崩溃[笑哭]

♥ 7 ↩ 1

MajorTom_leon 2025-08-15

太有意思了 这才是我想学的东西

♥ 7

Sien月 2025-08-22

我真的觉得很容易和复制快捷键搞混,不管是在linux还是win远程ssh

♥ 7 ↩ 14

DurhamAtISU 2025-08-15

好快的更新!

♥ 6 ↩ 4

crffffffff 2025-08-26

这个对深度学习也有大用,像是大语言模型训练的deepspeed crtl c驱动就直接暴毙了

♥ 4

AofPS 2025-08-23

07:47 不可见字符的打印

♥ 4

f-ws 2025-08-19

哇,突然发现简介还有解释

♥ 3 ↩ 1

要洗白白哦喵酱 2025-08-16

kill -15 <PID>

♥ 3

Orthodax 2025-08-15

编内也要加班吗

♥ 3 ↩ 1

Louis翔 2025-11-09

cloudflare的好多开源项目老喜欢在sigint上搞花活了

♥ 2