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会先转移执行新到来的信号处理流程,执行完毕后恢复原来的信号处理流程,不同的信号的信号处理函数会被打断。(可以类比多重中断理解)

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

相关推荐
MT5开发1 小时前
Linux安装MariaDB
linux·运维·mariadb
xingpanvip2 小时前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua
guygg882 小时前
基于遗传算法的双层规划模型求解MATLAB实现
开发语言·matlab
Lentou2 小时前
日志轮询策略
linux·服务器·网络
凯瑟琳.奥古斯特2 小时前
SQLAlchemy核心功能解析
开发语言·python·flask
Yoyo25年秋招冲冲冲2 小时前
【亲测可用】ubuntu系统下安装Openclaw+配置飞书
linux·ubuntu·ai·飞书·openclaw
卷Java2 小时前
GPTQ vs AWQ vs GGUF:模型量化工具横向测评
开发语言·windows·python
你好,帅哥2 小时前
openssl ,msys2 ,交叉编译
linux·运维·服务器
charlie1145141913 小时前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机