温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP中怎么实现一个信号中断系统

发布时间:2021-06-29 16:52:49 来源:亿速云 阅读:181 作者:Leah 栏目:大数据

这期内容当中小编将会给大家带来有关PHP中怎么实现一个信号中断系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

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对信号的处理】
PHP中怎么实现一个信号中断系统

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

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

上述就是小编为大家分享的PHP中怎么实现一个信号中断系统了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI