PHP 信号中断系统
中断系统跟PHP没有关系啊,不过PHP官方的pcntl扩展支持了,一般把正在执行的程序称为主程序,当中断源【比如键盘按下ctrl+c,ctrl+z等产生的硬件中断事件】发起一个中断请求事件【中断信号】,主程序会接受这个中断请求并停止当前正在运行的程序,然后转到中断服务程序去运行【中断响应】,中断服务程序也称为中断处理程序,程序打断的地方称为断点,中断服务程序处理完成后返回断点处继续执行,称为中断返回。
以上就是一个完整的中断处理过程。
中断源
硬件产生的中断:键盘【大部分人只能接触这些啦,如ctrl_c,ctrl+z产生的中断SIGINT,SIGTSTP等】
软件产生的中断:某个进程的子进程退出产生中断,定时信号,或是通过kill发出的中断或是在一个进程向另一个进程发出的中断,文件描述符变化产生中断等。
中断信号:
信号列表说明
中断处理:
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";
信号集和阻塞:
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、信号能传输的信息量非常有限,用户产生的信号不能附加各种信息及参数。