信号和信号处理
6.1 信号和中断
- 在Linux中,信号是一种异步通信机制,用于通知进程发生了某些事件。
- 当进程接收到信号时,它可以选择忽略信号、执行默认操作或执行自定义操作。
- “中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。而“信号”是要发送给进程的请求。
- 中断是发送给进程的事件,它将“进程”从正常活动转移到其他活动,称为“中断处理”。
- “进程”可在完成“中断”处理后恢复正常活动。
6.2 信号的分类
- Linux中的信号可以分为三类:标准信号、实时信号和自定义信号。
- 标准信号是预定义的信号,编号从1到31,例如
SIGINT
(中断信号)和SIGTERM
(终止信号)。 - 实时信号是可用于实时应用程序的信号,编号从32到64。
- 自定义信号是由进程自己定义的信号,可以使用任何编号。
6.3 信号的发送和接收
- 进程可以使用
kill
函数向其他进程或自身发送信号。 - 接收信号的进程需要使用
signal
函数或sigaction
函数来注册信号处理程序。 - 信号处理程序是一个函数,用于处理接收到的信号。
6.3 信号处理程序的执行
- 当进程接收到信号时,它可以选择执行默认操作、忽略信号或执行自定义操作。
- 默认操作通常是终止进程或停止进程。
- 进程可以使用
signal
函数或sigaction
函数来注册自定义信号处理程序。 - 当信号处理程序执行时,进程的正常执行流程会被中断,进入信号处理程序执行。
- 信号处理程序应该尽可能快地执行,以避免阻塞进程。
6.4 信号的阻塞和解除阻塞
- 进程可以使用
sigprocmask
函数来阻塞或解除阻塞信号。 - 当信号被阻塞时,进程不会接收到该信号。
- 当信号解除阻塞时,进程可以接收到该信号。
6.5 信号的排队
- 当进程接收到多个相同类型的信号时,这些信号会被排队,直到进程处理完当前的信号。
- 进程可以使用
sigaction
函数来设置信号的排队方式。
6.6 信号的处理机制
- Linux中的信号处理机制是基于事件驱动的,它允许进程在发生某些事件时立即响应。
- 信号处理程序是一种异步执行机制,它可以在进程的任何时间点执行。因此,信号处理程序应该尽可能快地执行,以避免阻塞进程。
- 进程收到某种信号的时候,并不是立即处理的。比如远处看到红绿灯变成红灯,我们会立即停下吗?并不会,我们会把看到红灯这件事记录在大脑中,等走到路口再停下。进程当前可能在执行优先级更高的东西,所以要选择合适的时候再处理这个信号。已经到来的信号会被暂时保存起来,以供在合适的时候处理,应该保存在哪里呢——进程控制块
task_struct
。 - 参考链接:https://blog.csdn.net/challenglistic/article/details/124413135
向ChatGpt请求苏格拉底式询问