Linux07(信号01)

#技术笔记

1. 中断针对的是CPU ,而信号针对的是进程 ,信号是一种异步事件通知机制,用于通知进程发生了某件事,所以信号是进程间通信的机制。进程间通信的机制还有管道 (分为有名管道、匿名管道)、消息队列、消息队列、共享内存、信号量、套接字(Socket)、内存映射文件、信箱。

2.信号来源

可以是硬件产生,也可以由软件产生。例如硬件有CPU异常(除零)、键盘中断、栈溢出、非法内存访问、非法指针、总线错误、浮点溢出等,软件有系统调用( kill 之类的)、子进程退出、进程调用abort()、

用户交互:用户通过键盘的操作,例如:ctrl + c, ctrl + \, ctrl + z

输入命令:在终端输入,例如,kill -9 pid ;<-------这里的pid是进程id

程序中:子进程结束,会产生SIGCHLD信号来通知父进程,对已经关闭的读端,进行写,可能会产生SIGPIPE信号

内核产生:硬件的故障

3.常用的信号: 2号信号(ctrl + c) SIGINT、3号信号(ctrl + \) SIGQUIT、9号信号 SIGKILL、18号信号 SIGCONT、19号信号 SIGSTOP(ctrl + z);13号信号SIGPIPE、17号信号SIGCHLD。

4.信号的行为

五种信号行为:

Term/Terminate表示终止进程;

Core表示进程会导出内存映像到文件(一般默认不产生);

Ign表示信号被忽略;

Stop表示暂停进程;

Cont恢复暂停的进程;

5.几种特殊信号的特点

2号信号触发可以用ctrl + c , 或执行 kill -2 pid 或 kill -SIGINT pid; 3号信号的触发可以使用 ctrl + \ , 或 kill -3 pid 或 kill -SIGINT pid, 19号信号触发可以用 ctrl + z, 或 kill -19 pid 或 kill -SIGSTOP pid.

6.信号的传递过程

首先有信号生成,然后信号传递,在信号传递中,内核为信号创建一个信号队列项,并将其加入到目标进程的位图或者信号队列(也就是图中的链表),信号也可能会覆盖旧的信号或者被丢弃,未决信号集有位图和链表,阻塞集合底层也是位图。进程通过修改其信号掩码来阻塞或解除阻塞特定的信,如果一个信号被阻塞,它仍然可以被递送到目标进程,但不会被立即处理。被阻塞的信号会留在待处理信号集合中,直到它们被解除阻塞。当正在运行的进程某一时刻从内核态执行返回用户态时, 在返回之前会先检查待处理信号集合,如果存在未被阻塞的待处理信号,内核会在进程继续执行前(返回用户态之前), 先安排信号处理程序的执行(默认或者自定义程序)。信号传递过程如下图。

  1. 信号注册函数 signal

signal 的第一个参数是传信号编号,第二个是传信号处理的函数(是一个函数指针)。

8.信号的三种处理方式

默认、忽略和自定义行为,在6.信号的传递过程有描述。为了防止用户将所有的信号的默认行为都更改掉,导致进程无法杀死,所以规定了9号和19号信号是不能更改默认处理行为。

9.多信号触发问题

这里得代码多调试感悟,原理先懂。

接收到另一个相同类型的信号 ,则先执行完目前的,再执行后面到来的信号,也就是当前信号处理流程不会中断,相同信号的信号处理函数是串行执行

接收到了另一个不同类型信号 ,那么当前信号处理流程会被中断,CPU会先转移执行新到来的信号处理流程,执行完毕后恢复原来的信号处理流程,不同的信号的信号处理函数会被打断。(可以类比多重中断理解)

如果接收到了连续重复的相同类型的信号,后面的重复信号会被忽略,从而该信号处理流程只能再多执行一次。

相关推荐
liulilittle13 分钟前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
朋克洛德的码农37 分钟前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang
x²+(y-√³x²)²=11 小时前
Linux打包文件到Windows,文件/文件类型丢失
linux·运维·windows
世人万千丶1 小时前
去重插入与超限淘汰:ArkTS 实现鸿蒙搜索历史的 LIMIT 艺术
运维·服务器·学习·华为·harmonyos·鸿蒙
柒号华仔1 小时前
「速通Shell」聚砖成墙,Shell函数封装之道
linux·ssh·bash
未来之窗软件服务1 小时前
企业自动化运营-电子合同预览-东方仙盟
运维·自动化·仙盟创梦ide·东方仙盟
程序员与背包客_CoderZ1 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
Android系统攻城狮1 小时前
Linux PipeWire深度解析之pw_properties_iterate调用流程与实战(六十五)
linux·运维·服务器·音频进阶·pipewire音频进阶
淼澄研学2 小时前
Kimi API黑产倒卖技术解析与Python合规接入指南
开发语言·网络·python
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法