博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 中的信号处理
阅读量:5996 次
发布时间:2019-06-20

本文共 1320 字,大约阅读时间需要 4 分钟。

首先我们需要了解几个函数
pcntl_signal   安装信号处理器,也就是当指定信号发生时,调用函数。
pcntl_alarm   指定秒数后向进程发送SIGALRM信号。
posix_getpid 返回当前进程id
posix_kill       给指定进程发送信号
 
一些常用的信号说明
SIGHUP本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时,通知同一session内的各个作业, 这时它们与控制终端不再关联。SIGINT程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出。SIGQUIT和SIGINT类似,但由QUIT字符(通常是Ctrl-/)来控制;进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。SIGKILL用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。SIGTERM程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。SIGUSR1留给用户使用SIGUSR2留给用户使用SIGALRM时钟定时信号, 计算的是实际的时间或时钟时间。alarm函数使用该信号。SIGCHLD子进程结束时, 父进程会收到这个信号。
例1:
当子进程退出时,会向父进程发送SIGCHLD信号,我们通过设置信号处理器,成功的处理信号。
例2:
父进程等待子进程的退出,子进程
等待3秒后输出child,再
等待3秒后向自身发送结束程序信号。
例3:
父进程在等待30秒后,向子进程发送SIGTERM结束程序信号。如果我们设置了SIGTERM信号的处理器,并且在自定义信号处理器中并没有杀死该进程,则该子进程会一直运行下去。
 
pcntl_signal()函数仅仅是注册信号和它的处理方法,真正接收到信号并调用其处理方法的是pcntl_signal_dispatch()函数。
例4:
通过函数
pcntl_alarm()
3秒后给进程发送SIGALRM信号,但信号处理函数并未调用。
原因是我们注释了declare(ticks = 1);这段代码,而又没有调用
pcntl_signal_dispatch()函数。
declare(ticks = 1);表示每执行一条低级指令,就检查一次信号,如果检测到注册的信号,就调用其信号处理器。但是这种处理方式效率很低,建议在代码循环中通过
pcntl_signal_dispatch()来处理信号。
pcntl_signal_dispatch()这个函数是PHP5.3以上才支持的,如果你的PHP版本大于5.3,建议使用这个方法调用信号处理器。
5.3以下的版本需要在注册信号之前加上:declare(ticks = 1);
 

 

转载于:https://www.cnblogs.com/jkko123/p/6294601.html

你可能感兴趣的文章
Flutter实战之实现一个简单的新闻阅读器
查看>>
推荐30个用于微服务的顶级工具
查看>>
Vector 源码分析
查看>>
计算机网络第三篇【数据链路层】
查看>>
JDK并发AQS系列(五)
查看>>
排名Top 16的Java实用类库
查看>>
画影图形: SVG & Canvas 图形对比
查看>>
frame和bounds的区别(转载)
查看>>
common-collections中Java反序列化漏洞导致的RCE原理分析
查看>>
缩减Docker镜像体积历程总结
查看>>
2019,Done is better than perfect
查看>>
RxJava2.0(四)线程之间切换的内部原理
查看>>
共建公安标准体系 | 七牛云与锐安科技达成深度战略合作
查看>>
寒冬之下,被cai的那些人到底去哪了?
查看>>
一步步带你实现Android网络状态监听
查看>>
设计模式:原型模式
查看>>
Nodejs 进阶:readline 实现日志分析 + 简易命令行工具
查看>>
我的Java设计模式-原型模式
查看>>
[单刷 APUE 系列] 第十六章——网络 IPC:套接字
查看>>
「轻算账」小程序实践笔记
查看>>