这期内容当中小编将会给大家带来有关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、信号能传输的信息量非常有限,用户产生的信号不能附加各种信息及参数。
上述就是小编为大家分享的PHP中怎么实现一个信号中断系统了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。