整理一篇学习笔记,把看到的一些要点和自己的理解都记下来。
目录
各位有没有在终端里按下 Ctrl+C 强行终止卡死程序的经历?有没有用 kill 命令 "终结" 过不听话的后台进程?甚至有没有遇到过程序突然崩溃、抛出 "段错误" 的惊魂时刻?
这些我们每天都在使用的操作背后,都藏着同一个幕后英雄 ——Linux 信号机制。它就像操作系统给进程发的 "短信",可以通知进程 "该下班了"、"出麻烦了"、"有新消息了"。而理解信号如何产生,就是读懂这套 "进程间通信语言" 的第一步。
本文我们就从最基础的源头讲起,带各位拆解键盘按键、系统命令、软件定时器、硬件异常这四大信号来源,让各位彻底搞懂:那个让程序戛然而止的信号,到底是从哪里冒出来的?
信号处理的基本流程示意图:
“信号产生” 对应着某个事件的发生(比如用户按下 Ctrl+C 产生 SIGINT 信号,或者程序除以零产生 SIGFPE 信号);“信号保存” 对应着内核将信号挂起在该进程的任务结构中(如果进程暂时不处理,信号会“排队”或保持为待处理状态);“信号处理” 则对应着进程在合适的时机(从内核态返回用户态时)执行对该信号的处理动作——可以是忽略、默认操作(如终止进程)或者调用自定义处理函数。
一产生信号
1-1通过终端按键产生信号
当你按下一个特殊的终端按键组合时(像是最常见的 Ctrl+C),这相当于触发了“信号产生”这一环节——终端驱动程序接收到按键信息,并将其转化为一个特定的 Linux 信号(比如 SIGINT)也可以当作是通过键盘产生信号
1-1-1 基本操作
1)Ctrl+C (SIGINT)
2)Ctrl+\(SIGQUIT)
可以发送终止信号并生成core dump文件,用于事后调试
```
include
include
include
void handler(int signumber) { std::cout暂时整理到这里。以上都是个人理解,可能有疏漏,欢迎指正。
评论 (0)
暂无评论