信号:通知目标进程某个状态的改变或系统异常。发送信号,接收信号,中断系统调用。
信号是操作系统用于向进程传递异步事件的一种机制。当某个事件(如非法操作、定时器超时、外部中断等)发生时,操作系统可以通过发送信号通知进程,以便进程可以采取相应的行动。信号是一种异步通知机制,进程可以在任何时刻接收到信号并处理它。
信号的实现机制
-
信号的产生:
- 硬件事件:如分配错误(
SIGSEGV
)、非法指令(SIGILL
)等,通常由CPU直接产生。 - 用户命令:如用户通过键盘输入
Ctrl+C
,操作系统产生SIGINT
信号。 - 系统调用:进程可以通过
kill()
、raise()
等系统调用向自己或其他进程发送信号。
- 硬件事件:如分配错误(
-
信号的发送:
- 操作系统将信号放入目标进程的信号队列中。
- 某些信号是不可阻塞和不可忽略的,例如
SIGKILL
,这些信号到达时立即执行默认动作。
-
信号的传递:
- 当进程处于用户态时,操作系统会定期检查该进程的信号队列,看看是否有待处理的信号。
- 如果有待处理的信号,操作系统会将其传递给进程,并根据设定的处理方式进行处理。
-
信号的处理:
- 默认处理:如果信号没有特殊处理程序,系统将执行信号的默认动作。
- 自定义处理:如果进程定义了信号处理函数,系统将在接收到信号时调用该函数。
-
信号屏蔽:
- 进程可以暂时屏蔽某些信号,使它们暂时无法被处理,待屏蔽解除后再处理这些信号。
- 这通常通过
sigprocmask
函数实现,进程可以在执行关键代码段时屏蔽某些信号,避免中断。
信号的应用场景
- 进程间通信:进程可以通过信号实现简单的进程间通信和同步。
- 异常处理:如处理非法内存访问、除零错误等。
- 进程控制:可以通过信号控制进程的启动、暂停、终止等行为。