嵌入式Linux系统编程学习之十三信号概念
信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件),是硬件中断的软件模拟(软中断),它是 UNIX 进程通信最古老的方法。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。
如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。一个完整的信号生命周期可以分为 3 个阶段,这 3 个阶段由 4 个事件来刻画:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。
信号的生命周期:
每个信号用一个整型常量宏表示,以 SIG 开头,如 SIGCHLD、SIGINT 等,它们在系统头文件 <signal.h> 中定义,也可以通过在 shell 下输入 kill -l 查看信号列表,或者输入 man 7 signal 查看更详细的说明。
信号的生成来自内核,让内核生成信号的请求来自 3 个地方。
- 用户:用户能够通过输入 Ctrl+C、Ctrl+\,或是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号;
- 内核:当进程执行出错时,内核会给进程发送一个信号,例如,非法段存取(内存访问违规)、浮点数溢出等;
- 进程:一个进程可以通过系统调用 kill 给另一个进程发送信号,一个进程可以通过信号和另一个进程进行通信。
进程接收到信号以后,可以有如下 3 种选择进行处理:
- 接收默认处理:接收默认处理的进程通常会导致进程本身消亡。例如,连接到终端的进程,用户按下 Ctrl+C ,将导致内核向进程发送一个 SIGINT 信号,进程如果不对该信号做特殊处理,系统将采用默认方式处理该信号,即终止进程的执行;
- 忽略信号:进程可以通过代码,显式的忽略某个信号处理,但是某些信号是不能被忽略的;
- 捕捉信号并处理:进程可以事先注册信号处理函数,当接收到某个信号时,由信号处理函数自动捕捉并处理该信号。
有两个信号既不能被忽略也不能被捕捉,它们是 SIGKILL 和 SIGSTOP ,即进程接收到这两个信号后只能接受系统的默认处理,即终止进程。
常见信号:用 kill -l 产看信号。
嵌入式Linux系统编程学习之十三信号概念相关推荐
- 嵌入式Linux系统编程学习之三十三网络相关概念
文章目录 一.网络相关名词的概念 1.套接口 2.端口号 3.IP 地址 二.Socket 概念 三.Socket 类型 四.Socket 的信息数据结构 五.数据存储优先顺序的转换 六.地址转格式转 ...
- 嵌入式Linux系统编程学习之二常用命令
嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...
- 嵌入式Linux系统编程学习之一目录结构
嵌入式Linux系统编程学习之一目录结构 文章目录 嵌入式Linux系统编程学习之一目录结构 前言 一.Linux目录结构 前言 Linux目录结构 一.Linux目录结构 /bin:存放Linux的 ...
- 嵌入式Linux系统编程学习之九基于文件描述符的文件操作
文章目录 前言 一.文件描述符 二.打开.创建和关闭文件 三.读写文件 四.改变文件大小 五.文件定位 六.原子操作 七.进一步理解文件描述符 八.文件描述符的复制 九.文件的锁定 十.获取文件信息 ...
- 嵌入式Linux系统编程学习之八基于文件指针的文件操作
文章目录 前言 一.文件的创建.打开与关闭 二.读写文件 三.文件定位 四.标准输入/输出流 五.目录操作 前言 对文件进行操作有打开文件.关闭文件.读写文件. 文件指针:每打开一个文件,就返 ...
- 嵌入式Linux系统编程学习之三vi编辑器
文章目录 前言 一.插入文本 二.删除与修改 三.光标的移动 四.查找与替换 五.块操作 六.结束编辑 前言 在Linux下编程,使用编辑器vi(vim).gedit或Emacs,编译链接器gcc,调 ...
- 嵌入式Linux系统编程学习之十七计时器与信号
文章目录 一.睡眠函数 二.时钟处理 一.睡眠函数 Linux 下有 2 个睡眠函数,原型分别为: #include <unistd.h>unsigned int sleep(unsi ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
- 嵌入式Linux系统编程学习之十六用程序发送信号
文章目录 一.kill 和 raise 信号发送函数 二.sigqueue 信号发送函数 一.kill 和 raise 信号发送函数 kill 和 raise 信号的发送函数的原型分别为: #in ...
最新文章
- 那些面试官,都是如何把候选人聊崩溃的
- 全球及中国钒(V)蒸发材料行业发展动态分析及未来前景预测报告2021年版
- MULE ESB简介
- watch深度监听数组_vue watch普通监听和深度监听实例详解(数组和对象)
- B监狱 noip 模拟 7.29(区间DP)
- 用于连接mysql的java类_【考试】列举Java连接数据库用到的类有哪些。
- SQL Server 2005中的分区表(四):删除(合并)一个分区
- android 自动化 录制,android 自动化录制回放测试工具
- Python 机器学习在线指南
- Redis 2.8.9源码 - Redis中的字符串实现 sds
- MySQL删除主从表数据
- 7.Jenkins 权威指南 --- 分布式构建
- 计算机网络技术用苹果电脑,苹果电脑到底支持哪些常用软件
- 从网络中获取债券收益率数据
- MySQL LEFT函数的使用
- 相对于就业来讲,前端工程师和后端开发哪个比较好?
- 简述使用计算机对会计工作的影响,会计电算化对会计工作的影响有哪些
- 详述数据中心内部通风的几种形态
- python idle怎么保存_Word文档如何设置自动保存
- C语言课设飞机票订购系统
热门文章
- Linux终端显示工作路径
- class? clazz参数_Java如何获取方法参数具体名称?这是个好问题
- php中的变量函数,PHP中的一些路径变量或函数
- 计算机的发展英语600词,程序员必备的600个英语词汇
- Codeforces 446C. DZY Loves Fibonacci Numbers【斐波那契+线段树】
- 解决Docker容器时间与主机不一致问题
- Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 ....
- Delphi用指针读取数组某个元素
- matlab中的种子数seed,set.seed()设置种子到底是啥作用?
- python读取csv文件_python配置文件的读取