中断信号
指软件中断信号,简称软中断。
中断信号处理程序(信号处理函数,信号捕捉函数)完以后,就会返回继续执行主程序。
中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。
引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念。
——中断
中断尽管可以提高计算机处理性能,但过于密集的中断请求/响应反而会影响系统性能。这类情形被称作中断风暴(interrupt storm)。
中断处理过程示意图
中断源
就是产生中断信号的单元。
- 在终端按下按键产生的中断信号 ctrl+c, ctrl+z, ctrl+\
- 硬件异常
- 在终端使用 kill 来发送中断信号
- posix_kill / kill(2) 函数、pcntl_alarm / alarm(2)函数
- 软件产生的中断信号 SIGURG [TCP/IP],SIGALRM
中断响应
对信号的处理。
- 忽略
- 执行中断处理函数(捕捉信号执行信号处理函数)
- 执行系统默认 signal ===> 动作[忽略,默认,执行用户编写好的信号处理函数]
中断返回
中断服务程序运行完之后返回。
信号对进程的影响:
直接让进程终止
让进程停止
SIGCONT 可以唤醒进程到前台继续运行
demo11.php
<?php echo posix_getpid(); while (1){ ; }
发送 SIGSTOP 让进程停止之后
[1] Killed php demo11.php [2] Killed php demo11.php [3]+ Stopped php demo11.php $jobs [1]+ Stopped php demo11.php
[1]、[2]、[3] 为任务编号
ctrl+z 它会让进程丢到后台去停止。
几个常用的中断信号
名称 | 功能描述 |
---|---|
SIGTSTP | 交互停止信号,终端挂起键 ctrl+z 终端驱动产生此信号 [终端停止符] 终止+core |
SIGTERM | 可以被捕捉,让程序先清理一些工作再终止。[终止] |
SIGSTOP | 作业控制信号,也是停止一个进程,跟 SIGTSTP 一样 |
SIGQUIT | 退出键 CTRL+\ 终端驱动程序产生此信号,同时产生core文件 [终端退出符] |
SIGINT | 中断键 delete/ ctrl+c [终端中断符] |
SIGCHLD | 子进程终止时返回 |
SIGUSR1 ,SIGUSR2 | 用户自定义信号 |
SIGKILL SIGSTOP | 不能被捕捉及忽略的,主要用于让进程可靠的终止和停止 |