中断信号

指软件中断信号,简称软中断。

中断信号处理程序(信号处理函数,信号捕捉函数)完以后,就会返回继续执行主程序。

中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。

引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念。

——中断

中断尽管可以提高计算机处理性能,但过于密集的中断请求/响应反而会影响系统性能。这类情形被称作中断风暴(interrupt storm)。

中断处理过程示意图

中断处理过程示意图

中断源

就是产生中断信号的单元。

  1. 在终端按下按键产生的中断信号 ctrl+c, ctrl+z, ctrl+\
  2. 硬件异常
  3. 在终端使用 kill 来发送中断信号
  4. posix_kill / kill(2) 函数、pcntl_alarm / alarm(2)函数
  5. 软件产生的中断信号 SIGURG [TCP/IP],SIGALRM

中断响应

对信号的处理。

  1. 忽略
  2. 执行中断处理函数(捕捉信号执行信号处理函数)
  3. 执行系统默认 signal ===> 动作[忽略,默认,执行用户编写好的信号处理函数]

中断返回

中断服务程序运行完之后返回。

信号对进程的影响:

  1. 直接让进程终止

  2. 让进程停止

    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不能被捕捉及忽略的,主要用于让进程可靠的终止和停止