别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
合集 · 直观理解计算机技术【CoreDumped】 (68)
-
代码中指定变量类型为何如此重要?
11:03
-
栈为何如此之快?
13:46
-
堆为何如此之慢?
17:53
-
动态数组的内部机制(ArrayList VS LinkedList)
19:56
-
探索计算机并发与多任务处理的历史
15:37
-
晶体管是如何运行代码的?
12:54
-
晶体管是如何记忆数据的?
16:12
-
制作一个CPU来运行程序
18:47
-
计算机如何将字符串转换为数字
11:23
-
动态随机存取存储器(DRAM)的工作原理
17:18
-
计算机处理器是如何运行条件和循环的?
16:05
-
一个程序不是一个进程
6:51
-
深入理解进程,如何进行上下文切换?计算机科学中最深刻和最成功的想法之一。
14:52
-
处理器内部的单个位如何保护操作系统的完整性?
20:20
-
计算的心跳:时钟如何推动 CPU 前进?
13:14
-
英语原声版-计算的心跳:时钟如何推动 CPU 前进?
14:22
-
(英语原声)进程间通信:共享内存或发送消息
14:15
-
(中文配音)进程间通信:共享内存或发送消息
12:29
-
(中文配音)为什么单核处理器需要线程?
14:59
-
(英语原声)为什么单核处理器需要线程?
16:07
-
(中文配音)多核系统上的线程
9:26
-
(英语原声)多核系统上的线程
11:27
-
(中文配音)为什么应用程序是特定于操作系统的?
11:52
-
(英语原声)为什么应用程序是特定于操作系统的?
13:09
-
(英语原声)硬件如何在多任务处理中协助软件?
13:15
-
(中文配音)硬件如何在多任务处理中协助软件?
11:29
-
链表的一个实际应用
20:34
-
让你的电脑运行更流畅的奇妙算法
45:02
-
(流畅中文配音)让你的电脑运行更流畅的奇妙算法
43:38
-
(原声双语字幕)当程序调用 sleep() 时会发生什么?
19:41
-
(流畅中文配音)当程序调用 sleep() 时会发生什么?
17:57
-
这个简单算法驱动了真正的解释器:Pratt Parsing
20:40
-
(双语字幕)编程中最难以捉摸的Bug:竞态条件
18:19
-
(流畅中文配音)编程中最难以捉摸的Bug:竞态条件
19:23
-
(中文配音)阻止内存攻击的底层电路
16:02
-
(英语原声)阻止内存攻击的底层电路
14:51
-
为什么有些项目会使用多种编程语言?
18:04
-
为什么有些项目会使用多种编程语言?
19:32
-
别再杀进程了!让 Ctrl+C 变成“喵”……(用信号实现)
17:15
-
别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
19:23
-
80 年代避免竞态条件的算法(以及它为何失败)
19:05
-
80 年代避免竞态条件的算法(以及它为何失败)
19:43
-
CPU如何与众多不同设备交互?
22:10
-
(中文配音)CPU如何与众多不同设备交互?
23:52
-
(中文配音)你每天都在用的奇特CPU操作
14:04
-
你每天都在用的奇特CPU操作
13:04
-
(中文配音)历史如何塑造了我们今天仍在使用的编程术语?
18:04
-
(英语原声)历史如何塑造了我们今天仍在使用的编程术语?
17:42
-
为什么有些底层项目里会充满这种奇怪的代码?
16:41
-
(中文配音)为什么有些底层项目里会充满这种奇怪的代码?
16:39
-
编译与解释代码如何共处同一程序中?
21:35
-
(英语原声)编译与解释代码如何共处同一程序中?
21:30
-
【双语字幕】Core Dumped 常见问题的集中回答
17:09
-
【双语字幕】90年代的设计决策阻碍了Python并行化
13:36
-
【中文配音】90年代的设计决策阻碍了Python并行化
12:01
-
Linux创建进程的奇怪方式
17:51
-
【中文配音】Linux创建进程的奇怪方式
18:14
-
CPU如何运行函数?
19:49
-
【中文配音】CPU如何运行函数?
19:38
-
没有人解释的问题:内核的边界在哪里?
17:15
-
【英语原声】没有人解释的问题:内核的边界在哪里?
19:36
-
硬件如何让线程问题不再那么棘手?
35:49
-
为什么在macOS、Windows和Linux上安装应用程序如此不同?
19:47
-
游戏公司真的能破坏你的电脑吗?
24:00
-
一个视频说透“架构”:为什么你的程序换个CPU就可能跑不了?
10:43
-
CPU如何执行有符号和无符号运算?
14:45
-
简单指令, 奇妙算法
19:11
-
当CPU遇到它不认识的指令,会发生什么?😱【底层原理】
9:26
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
一些脚本直接按ctrl c会显示一行请输入exit确认结束就是这样做到的吧,防止意外关掉
♥ 35 ↩ 5
讲的太好了,从初学者视角遇到问题提出解决办法[星星眼]
♥ 20 ↩ 3
信号其实也不完全可靠。在有些unix机器上,A在处理B发来的信号时,C发来的信号就会被弄丢
♥ 14 ↩ 1
良作无人!
♥ 13 ↩ 4
最近在Python里用过信号 感觉有点莫名其妙的 换个语言和视角有不同的思考[doge][doge]
♥ 7 ↩ 6
未看先猜signal()
♥ 6 ↩ 1
oi比赛防re,直接劫持停止信号
♥ 6
@Swiffen_ @千年木在台儿庄竞走 @七月的艾琳故事
♥ 4 ↩ 2
progam_b的main函数签名这么写是不行的吧? 我改成了int main(int argc, char *argv【】)
♥ 3
讲解挺好,有一个地方我觉得值得商榷,在Ctrl-C这个例子里,shell应该是没有任何作用的,它当时应该在wait子进程,而不是在等待键盘输入;ctrl-c是键盘输入直接先被内核拿到,识别为信号,然后直接发送给正在运行的前台进程的。所以这个地方提到shell个人感觉有点多余,也容易引起误会
♥ 2
讲的真好,我来分享一下我遇到的问题,我用Python发信号,但是信号并没有被捕捉到,不知道是不是我哪里写错了
♥ 2 ↩ 1
还是c嘎嘎
♥ 2
[打call][打call][打call]学习了
♥ 1
如果能讲kill -19特性就好了,但是我觉得不可能
♥ 1 ↩ 1
加油!
♥ 1
讲的真不错!
♥ 1
C#可以直接用Console.CancelKeyPress事件[笑哭]
还是太靠程序自觉了,这就是为什么有些流氓进程怎么关都关不掉,TMD
↩ 1
大佬我这个可以吗?