-
总览
-
信 总览
- 信 分了三个章节进行介绍.
- 本章介绍基础理论,简单但是非常重要且有必要.
-
本章总览
- 各种信 和使用场景.
- 信 源:内核,进程或自己.
- 信 屏蔽:屏蔽的信 被挂起排队,等到取消屏蔽的时候处理.
- 信 等待:暂停执行进程,等待信 的到来.
-
-
概念总览
-
使用
-
什么是信
- 进程间或进程与内核间的通讯方式.
- 某进程收到信 ,表示有与之相关的事情发生,需要立即处理或等会儿处理,和进程的处理策略有关.
-
软件中断
- 和硬件中断打断处理器一样,软件中断打断进程的执行,让其执行代码进行响应.
-
信 源
- 拥有权限的信 可以发送信 给其他进程.
- 常见:通过指令发送信 给其他进程.
- 进程自己可以发送给自己或自己的某个线程.
- 信 源一般都是内核产生.
-
作用
- 可用作进程间同步机制,甚至进程间交流.
-
-
案例分析
-
硬件错误
- 硬件检测错误,由内核转发.
- 如:地址翻译硬件检测无映射,内核转发;或者处理器执行除操作,内核转发.
-
用户输入
- 中断将特殊字符产生的信 .
- 中断进程.
- 中断并挂到后台.
-
内核通知事件需要处理
- 多路复用的信 驱动读写.
- 终端窗口发生变化.
- 定时器超时.
- 处理器使用时间超限.
- 子进程死亡.
-
-
信 定义
-
实际
- 一个整数.
- 宏定义以的格式声明.
-
开发
- 不同平台值代表信 不一样,所以使用宏定义别名,而不是具体数字.
-
-
两类信
-
实时信
- 传统的信 ,或者标准信 .
- 一般用于内核提示进程.
- 使用区间.
-
实时信
- 详细介绍
-
-
信 处理
-
生成
- 发送,并添加到进程描述符中,等待处理.
-
处理
- 一般是被时钟中断了之后,切换上下文,退出内核空间前检测,如果有信 需要处理就会处理.
- 或者是如果正在执行立即处理.
-
信 屏蔽
- 信 处理可能会打断正在使用内核栈的系统调用,导致系统调用失败.
- 为了避免这种情况:可以屏蔽某些信 ,等到后面方便的时候取消阻塞,处理对应时间.
- 屏蔽的信 阻塞排队,直到取消阻塞.
-
-
进程处理方式
-
忽略
- 内核丢弃,甚至进程都不知道这个信 .
-
终止进程
- 进程被杀死.
- 进程正常死亡是,异常则是直接内核干掉,不用通知进程任何事情.
-
生成并终止进程
- 会生成杀死那一刻的内存信息.或者说是这个时刻的虚拟内存空间数据.
- 保留了大部分的数据,用作调试排查错误.
-
暂停
- 进程停止执行,一般是调试
-
继续
- 进程恢复执行,一般是调试。
- 如果之前没有处于停止状态则忽略.
-
-
开发者可自定义
-
默认
- 一般用于修改后恢复原来的操作.
-
忽略
- 一般用于屏蔽某些无用或不感兴趣的信 .
-
自定义函数
- 函数执行,在内核中执行,和普通函数一样.
- 一般用来专门响应某个信 ,执行某一些任务.
- 这类信 叫做被处理或捕获.
-
-
自定义局限
-
局限
- 不能修改为内核的默认行为中的.
- 但是可以是忽略.
- 也就是说自定义也是有局限性的.
-
简介实现
- 虽然无法直接修改行为,但是可以通过间接的方式修改.
- 在信 响应函数中执行对应的函数来发起另一个信 ,以此来间接的达到同样的效果.
-
-
进程信 状态查看
-
位置
-
内容
- 包含了各种各样的信 信息,以掩码的形式表示。
- 以进制表示.
-
关联字段
- 线程挂起的信 .
- 进程挂起的信 .
- 进程屏蔽的信 .
- 进程忽略的信 .
- 进程捕获的信 .
-
-
-
信 类型和默认行为
-
信 与宏
-
理论
- 使用的常规信 是
-
实际
- 名字超过,不同名字对应的值相同.
- 或者是不同的平台支持的不同.
-
-
信 介绍
-
-
原因
- 进程中调用函数.
-
结果
- 默认生成文件.
-
-
-
原因
- 内核中通过设置的的实时定时器超时.
-
介绍
- 这种时钟.
-
-
-
原因
- 内存访问错误.
-
案例一
- 映射预留空间.
- 即的页面中创建了的空间用于映射,文件大小,这是只有第一块中的前存在文件映射,可以访问,但是访问这个不存在任何映射的空间就是错误.
-
-
-
原因
- 父进程的某个子进程死亡.的方式死亡.
-
使用
- 这种一般是通知父进程通过函数获取子进程的死亡信息,并释放最后的空间.
-
-
-
使用
- 发送信 给暂停状态的进程。
-
处理
- 处于暂停恢复,不是就忽略.
- 执行一些恢复的代码.一般是用户自定义.
-
拓展
- 后面其他章节有详细介绍
-
-
-
原因
- 算数计算错误,比如:除0.
-
分析
- 虽然是浮点,但是整数仍然使用.
- 实际上这个信 的产生主要和处理器架构和对应的控制寄存器的实现.
-
举例
- 中,虽生成,但是师傅处理根据内核配置,即是否允许除.
- 允许就生成,不允许就得到的结果就是无限大.
-
-
-
案例一
- 终端客户端与服务器的连接中断,内核就会发送信 给服务器程序,停止执行.或挂起.
- 后面章节分析.
-
案例二
- 使用这个信 发送给守护进程,让其重新读取配置,重新初始化执行.
- 系统也是通过这个信 告知守护来重启
-
-
-
原因
- 错误执行机器指令.
-
-
-
平台
- 类似.
- 源于
-
原因
- 获取正在执行的前台程序的信息.
-
-
-
原因
- 用户输入,中段驱动程序发送对应信 给前台进程组.
-
响应
- 默认是终止进程
-
-
-
使用
- 一般是创建信 驱动程序时使用的信 .
-
-
-
平台
- 类似
- 实现硬件定义错误.
-
-
- 特殊信 ,一定终止,不能被忽略,阻塞,捕获.
-
-
原因
- 进程写入一个或的接收方挂了的时候。
- 接收方已经关闭了对应的文件描述符.
-
拓展
- 其他章节介绍.
-
-
- 上和类似,从推演过来.
-
-
原因
- 设置的定时器超时.
-
这类定时器特点
- 用时钟计时,精度更高更准确.
-
拓展
- 单独章节介绍
-
-
-
原因
- 信 .
-
分析
- 如果一个系统有一个机制,可以为后台电量检测设置一个检事件.
- 比如块完了的时候发送一个信 给进程,并关掉系统.
-
-
-
原因
- 用户输入特殊字符,信 发送给正在执行的前台程序.
-
默认
- 关闭并生成一个.
-
使用
- 应用程序处于死循环或位置状态.退出生成调试信息.并获取堆栈.
-
-
-
原因
- 进程非法访问内存.
-
生成场景分析
- 访问不存在映射的虚拟地址.
- 进程对只读内存进行写入.
- 用户态进程访问内核空间,。
-
典型
- 指针操作.
- 或者是符 类型错误,符 有效值错误.
-
-
- 同,不能忽略,阻塞,捕获.因此总是终止进程.
-
-
原因
- 进程错误调用系统调用.
-
分析
- 使用的系统调用编 不合法.
- 如合法,就不合法.
-
-
-
说明
- 标准友好的用于停止进程的信 ,也是指令的默认值.
-
指令说明
- 一般是,就是,这种不友好,因为有的进程需要在停止钱写入数据到磁盘中.
-
提示
- 好的程序应该为这个信 设置一个处理函数,让进程友好退出,友好的释放文件资源,以及其他资源.
- 信 应该作为最后的选择.毕竟这种太粗鲁.
-
-
-
场景
- 用于断点粗发,系统调用跟踪.
-
-
- 和同名的.
-
- 收到紧急指针.
-
-
分析
- 为开发者保留的特殊信 ,用于用户自定义目的.
- 开发者可以将这两个信 用做任何的目的.
-
-
- 内核生成,因为设置的虚拟定时器超时,精度处理器时钟周期.
-
-
原因
- 在图形化界面下,窗口发生了大小变化.
- 针对变化,应用应该进行重绘,或作出一些其他调整.
-
-
- 进程使用处理器时间超时,具体看.
-
- 文件将要超过文件上限.
-
-
信 总结
-
说明
- 列表示常见平台和特殊平台.
- 标准的会有一个圆点
- 表示默认行为:进程终止,生成镜像并终止,忽略,表示停止进程,表示恢复执行进程.
-
表格
Name Signal number Description SUSv3 Default SIGABRT 6 Abort process /td> core SIGALRM 14 Real-time timer expired /td> term SIGBUS 7 (SAMP=10) Memory access error /td> core SIGCHLD 17 (SA=20, MP=18) Child terminated or stopped /td> ignore SIGCONT 18 (SA=19, M=25, P=26) Continue if stopped /td> cont SIGFPE 8 Arithmetic exception /td> core SIGHUP 1 Hangup /td> term SIGILL 4 Illegal instruction /td> core SIGINT 2 Terminal interrupt /td> term SIGIO/SIGPOLL 29 (SA=23, MP=22) I/O possible /td> term SIGKILL 9 Sure kill /td> term SIGPIPE 13 Broken pipe /td> term SIGPROF 27 (M=29, P=21) Profiling timer expired /td> term SIGPWR 30 (SA=29, MP=19) Power about to fail /td> term SIGQUIT 3 Terminal quit /td> core SIGSEGV 11 Invalid memory reference /td> core SIGSTKFLT 16 (SAM=undef, P=36) Stack fault on coprocessor term SIGSTOP 19 (SA=17, M=23, P=24) Sure stop /td> stop SIGSYS 31 (SAMP=12) Invalid system call /td> core SIGTERM 15 Terminate process /td> term SIGTRAP 5 Trace/breakpoint trap /td> core SIGTSTP 20 (SA=18, M=24, P=25) Terminal stop /td> stop SIGTTIN 21 (M=26, P=27) Terminal read from BG /td> stop SIGTTOU 22 (M=27, P=28) Terminal write from BG /td> stop SIGURG 23 (SA=16, M=21, P=29) Urgent data on socket /td> ignore SIGUSR1 10 (SA=30, MP=16) User-defined signal 1 /td> term SIGUSR2 12 (SA=31, MP=17) User-defined signal 2 /td> term SIGVTALRM 26 (M=28, P=20) Virtual timer expired /td> term SIGWINCH 28 (M=20, P=23) Terminal window size change ignore SIGXCPU 24 (M=30, P=33) CPU time limit exceeded /td> core SIGXFSZ 25 (M=31, P=34) File size limit exceeded /td> core
-
-
-
修改信 默认处理行为
-
两种方式
-
- 本章介绍.
- 因为不同的系统实现可能不同,所以不建议用这个做可移植程序开发.
- 而是下面这个.
-
- 其他章节介绍.
- 常用.
-
-
-
功能
- 修改信 的处理行为并设置对应响应函数.
-
原型
-
返回值
- 类型:,和传入类型一样.
- 成功:之前定义的函数.
- 失败:
-
- 修改的信 .
-
- 用于响应的函数.
- 特殊值:重置为默认,忽略信 .
-
修改后恢复案例
- 这个函数不能不修改查询,如果要这样做,只能用.
-
入参和返回值简化
- 一般来说,如果定义了,中就会有上面那个定义.
-
-
-
信 处理函数
-
处理函数
-
概念
- 进程定义来用于响应信 的函数.
-
其他
- 下个章节详细介绍
-
-
触发
-
说明
- 在下一个调度周期,从内核中退出时,如果检测到了,就修改寄存器,指向注册函数的位置,执行完了之后恢复.就好像什么都没有发生一样.
-
函数
- 虽然说这个函数里面可以干任何事情,但是做的事情应该尽量的简短.
- 如果太长,比如都不算太友好.后面章节分析.
-
-
信 处理函数入参
-
一个信 一个函数
- 这个时候入参无意义。
-
一个函数多个信
- 可以用进行区分.
-
-
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
-
Linux内核信 基本概念
•
软件开发