vlambda博客
学习文章列表

PHP 信号中断系统


中断系统跟PHP没有关系啊,不过PHP官方的pcntl扩展支持了,一般把正在执行的程序称为主程序,当中断源【比如键盘按下ctrl+c,ctrl+z等产生的硬件中断事件】发起一个中断请求事件【中断信号】,主程序会接受这个中断请求并停止当前正在运行的程序,然后转到中断服务程序去运行【中断响应】,中断服务程序也称为中断处理程序,程序打断的地方称为断点,中断服务程序处理完成后返回断点处继续执行,称为中断返回。

PHP 信号中断系统

以上就是一个完整的中断处理过程。

中断源
硬件产生的中断:键盘【大部分人只能接触这些啦,如ctrl_c,ctrl+z产生的中断SIGINT,SIGTSTP等】
软件产生的中断:某个进程的子进程退出产生中断,定时信号,或是通过kill发出的中断或是在一个进程向另一个进程发出的中断,文件描述符变化产生中断等。

中断信号:
PHP 信号中断系统
信号列表说明

PHP 信号中断系统
PHP 信号中断系统
PHP 信号中断系统

中断处理:
1、执行默认动作
2、忽略
3、执行用户自定义的信号处理函数 【捕获】

中断信号的处理例子【PHP手册】

echo "安装信号处理器...\n";
pcntl_signal(SIGHUP, function($signo) {//中断处理程序
echo "信号处理器被调用\n";
});

echo "为自己生成SIGHUP信号...\n";
posix_kill(posix_getpid(), SIGHUP);//产生中断请求

echo "分发...\n";
pcntl_signal_dispatch();

echo "完成\n";

PHP 信号中断系统

信号集和阻塞:
1、信号递达时处理的动作
2、信号未决集
3、信号阻塞集

进程可以选择阻塞某个信号,阻塞的信号,当产生时将会放在未解决集,除非已经解除阻塞,才能捕获到。
信号集操作
1、初始化一个信号集 【sigemptyset】
2、添加/删除信号 【sigaddset,sigdelset】
3、判断某个信号是否属于某个集合里 【sigismember】
4、信号集阻塞函数 sigprocmask 【pcntl_sigprocmask】
5、未决信号集sigpending
6、信号处理函数signal,sigaction【pcntl_signal】

信号阻塞测试:【信号无法递达,只能在未决集合里,可以查看/proc/PID/status对信号的处理】

检测一个进程是否存在【向进程组发送信号】
posix_kill(posix_getpid(), 0);

信号【软中断】的局限性:
1、信号的系统开销太大。
2、发送信号的进程要进行系统调用。
3、内核要中断接受信号的进程,而且要管理它的堆栈,同时还要调用处理程序,后之还要恢复被执行的中断的进程。
4、信号的数量非常有限【linux支持64个】
5、信号能传输的信息量非常有限,用户产生的信号不能附加各种信息及参数。