聊聊Linux信号——信号产生

整理一篇学习笔记,把看到的一些要点和自己的理解都记下来。

目录

一产生信号

1-1通过终端按键产生信号

1-1-1 基本操作

1)Ctrl+C (SIGINT) 

2)Ctrl+\(SIGQUIT)   

3)Ctrl+Z(SIGTSTP)

1-1-2 理解OS如何得知键盘有数据

1-1-3 初步理解信号起源

2-1 调用系统命令向进程发信号

2-1-1例子

2-1-2kill

2-1-3raise

2-1-4abort

3-1由软件条件产生信号

3-1-1基本alarm验证-体会IO效率麻烦

3-1-2设置重复闹钟

3-1-2-1 代码执行流程

3-1-3如何理解软件条件

4-1硬件异常产生信号

4-1-1模拟除0

4-1-2模拟野指针

4-1-3子进程退出core dump

5-1总结思考


各位有没有在终端里按下 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)

暂无评论