中断信号

[[../../../信号集]]

信号 是指软件中断信号,简称软中断,中断信号处理过程

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

中断源 : 就是产生中断信号的单元

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

中断相应 ,对信号的处理

  1. 忽略
  2. 执行中断处理函数[捕捉信号执行信号处理函数]
  3. 执行默认操作

中断返回 就是指中断服务程序运行完之后返回

几个常用的中断信号

信号

说明

SIGTSTP

交互停止信号,终端挂起 ctrl+z 终端驱动产生此信号,终止+core文件

SIGTERM

可以被捕捉,让程序先清理一些工作再终止

SIGSTOP

作业控制信号,也是停止一个进程,跟SIGTSTP一样

SIGQUIT

退出键 ctrl+\ 终端驱动程序产生,同事产生core文件

SIGINT

中断键 del/ctrl+c

SIGCHLD

子进程终止时返回

SIGUSR1,SIGUSR2

用户自定义信号

SIGKILL SIGSTOP

不能被 捕捉及忽略的信号,主要用于让进程可靠的终止和停止

SIGCONT

可以唤醒被停止的进程到前台继续运行

PHP扩展提供的函数

pcntl扩展, pcntl_alarm, pcntl_signal, pcntl_signal_dispatch … https://www.php.net/manual/zh/book.pcntl.php

中断系统调用

当进程正在执行系统调用的时候,接受到了中断信号,那么这个系统调用就会被中断,比如进程正在写文件, 系统会中断无法恢复,系统调用函数会返回 -1 会设置EINTR中断错误

如果能恢复,我们成为 “可重入函数” 否则就是非可重入函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

echo posix_getpid();

/*
 * int $signal 信号编号
 * callable|int 信号处理函数
 * bool 是否要重启被中断的系统调用
 * 应用程序(PHP解释器) -> 库函数/系统调用函数 -> 系统内核
 * strace 可以跟踪系统调用
 * */
// 信号捕捉,自定义信号处理程序,不要写太多的业务逻辑,一般来说我们经常吧中断信号用于通知
function handle($signal){
    function ($signal){
        fprintf(STDOUT,"我接受到一个信号: %d\n",$signal);
    }
}
pcntl_signal(SIGINT,'handle');
pcntl_signal(SIGUSR1,'handle');
while(true){
    pcntl_signal_dispatch();
}

进程启动的时候,信号的处理是系统默认动作,自己编写处理函数会覆盖系统默认动作,有些信号不可以被覆盖,如SIGKILL SIGTOP

子进程可以继承父进程的信号处理函数,并且可以编写自己的以覆盖自己继承的处理函数,即重置