惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
SecWiki News
SecWiki News
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
WordPress大学
WordPress大学
NISL@THU
NISL@THU
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Privacy & Cybersecurity Law Blog
Jina AI
Jina AI
AWS News Blog
AWS News Blog
Scott Helme
Scott Helme
Martin Fowler
Martin Fowler
C
Cybersecurity and Infrastructure Security Agency CISA
Forbes - Security
Forbes - Security
H
Heimdal Security Blog
小众软件
小众软件
I
Intezer
A
Arctic Wolf
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
O
OpenAI News
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
Latest news
Latest news
G
GRAHAM CLULEY
Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
N
News and Events Feed by Topic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V2EX - 技术
V2EX - 技术
Stack Overflow Blog
Stack Overflow Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
L
LINUX DO - 最新话题
博客园 - Franky
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
P
Proofpoint News Feed
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
T
The Exploit Database - CXSecurity.com
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
F
Full Disclosure
Security Latest
Security Latest

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 5-3 会话 2021-03-25 「PHP架构师」面试准备 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-3 信号集 2022-03-10 面试复盘 4-1 什么是中断信号(软中断) 3-7 进程查看 3-6 SUID特权进程 3-5多进程编写 3-4进程调度 3-3进程exec 3-2进程退出和回收 3-1进程标识与fork 2-3解释器文件 2-2命令行参数与环境参数表 2-1程序与进程 1-1课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇 第四章 定位篇 第三章 金钱篇 第二章 富人篇 第一章 财务自由篇 财富思维觉醒课前作业 This Set Cookie Was Blocked Because It Was Not Sent Over a Secure Connection 「转」Windows11右键恢复至Windows10模式 Ecshop 4.0 微信登录 一直循环授权登录 PHP判断指定日期是否为工作日 PHP Ajax 跨域请求允许多个域名 返回键劫持,强制跳转到指定链接 Chromium Adobe Flash Player下载 批量检查并清除BOM头 Ecshop之smarty与js冲突问题 Ecshop 广告位宽度值必须在1 1024之间 修改方法 PHP获取指定时区当前时间-PHP获取世界时钟 phpcms 更新栏目缓存 `PHP Has Encountered a Stack Overflow` 解决办法 php判断是否手机访问-php判断访问终端类型 丢了 如果昨天是明天的话就好了,这样今天就周五了 Ecshop自定义调用指定广告位 Destoon修改商务便签文字 Ecshop首页获取指定分类的推荐商品 QQ空间如何屏蔽好友刷屏广告 Css实现文字竖排 英尺(inch)、厘米(cm) JS转换 网页禁止鼠标右键 Destoon 选择支付方式 可单独关闭对联广告两枚 网页打开不是在最顶部,而是跳到中间位置解决方法 Ecmall iis 伪静态规则 Destoon 复制商城模块 QQ在线客服设置 QQ开启临时会话教程 Ecshop加入购物车js报错 IE浏览器“浏览器模式”和“文本模式” 网站图片在IE浏览器下不显示 Ecshop 去掉头部版权信息 echsop “transport.js/run() error:'process_request' 未定义”-解决方法 Ecshop Deprecated:Assigning the Return Value of New by Reference Is Deprecated in 报错解决方法 PHPCMS全局循环调用二级类目导航 如何使EditPlus打开tpl文件高亮显示代码 Ecshop前台英文后台中文实现方法 Ecshop安装报错warning:date_default_timezone_get() 1970年1月1日(00:00:00 GMT)Unix时间戳(Unix Timestamp) 黑莓bb微信 2.6 for os5 黑莓微信内测版问题总结及开发建议 360安全卫士卸载过程 管理距离AD值(Administrative Distance) 思科在中国的总代及金牌、银牌代理商 黑莓7100T拆机全程实录 CCNA静态路由配置实例 8700G国产壳白色,太粗糙了 黑莓7100T玉照曝光 黑莓手机电池的正确使用和保养 51啦统计不能打开,求分析,求解释 处女作,黑莓8707G4.2主题出炉 我的2011 Xweibo手机版底部版权修改 常用ping地址,逗逗搜索引擎,SEO必备 飞飞影视系统快播播放列表前缀修改 飞飞影视系统title修改 这才整明白啥叫被跨省,上网有风险,发帖需谨慎 为emlog添加Gravatar头像服务功能 三层交换机实现VLAN间通信 路由器的基本配置 路由器接口类型及连接方式 19岁双IE 谈Cisco认证 Secondary IP-Address 用途 儿童节NA战报 CCNA疑难解析之network x.x.x.x
4-2 编写中断信号处理程序
王二 · 2022-03-15 · via WangDeer

pcntl_signal 信号处理函数

安装一个信号处理器。

说明:

pcntl_signal(int $signo, callback $handler, bool $restart_syscalls = true): bool

函数 pcntl_signal 为 signo 指定的信号安装一个新的信号处理器。

参数:

  1. signo

    信号编号。

  2. handler

    信号处理器可以是用户创建的函数或方法的名字,也可以是系统常量 SIG_IGN(译注:忽略信号处理程序)或SIG_DFL(默认信号处理程序).

    注意:

    注意当你使用一个对象方法的时候,该对象的引用计数回增加使得它在你改变为其他处理或脚本结束之前是持久存在的。

  3. restart_syscalls

    指定当信号到达时系统调用重启是否可用。(译注:经查资料,此参数意为系统调用被信号打断时,系统调用是否从 开始处重新开始,但根据http://bugs.php.net/bug.php?id=52121,此参数存在bug无效。

成功时返回 true, 或者在失败时返回 false。

中断系统调用

当进程正在执行系统调用的时候,接收到中断信号,那么这个系统调用就会被中断,比如说进程正在写文件,无法恢复。

如果能恢复我们称为:可重入函数,否则就是非可重入函数。

若一个程序或副程序可以“在任意时刻被中断然后操作系统调度执行另一段代码,这段代码又使用了该副程序不会出错”,则称其为可重入(reentrant 或 re-entrant)的。即当该副程序正在运作时,执行线程可以再次进入并执行它,仍然可得到符合设计时所预期的结果。与多线程并发执行的线程安全不同,可重入强调对单一线程执行时重新进入同一个子程序仍然是安全的。

——可重入

一般在中断信号处理函数,不要写太多的业务逻辑。

我们经常把中断信号用于通知。

中断信号动作

每个信号都有相应的动作(信号处理程序):

  1. 用户自定义的中断信号处理程序
  2. SIG_DEF 系统默认动作(结果一般都会让进程终止或是停止,终止+core)
  3. 忽略 SIG_IGN ignore

进程启动的时候,信号的动作默认是系统行为,如果编写对应处理程序,会覆盖掉默认动作,有些信号不可以覆盖,例如 SIGKILL、SIGSTOP。

信号处理程序的继承

当父进程创建一个子进程的时候,子进程是继承父进程的中断信号处理程序的。


function sigHandler($signo)
{
    fprintf(STDOUT, "pid = %d,我接收到一个信号:%d \n", posix_getpid(), $signo);
}

pcntl_signal(SIGINT, 'sigHandler');
pcntl_signal(SIGUSR2,SIG_IGN); // 忽略信号

// SIGKILL、SIGSTOP 信号是无法捕捉的,编写的信号处理程序不会执行
// pcntl_signal(SIGKILL, 'sigHandler');
// pcntl_signal(SIGSTOP, 'sigHandler');

$pid = pcntl_fork();

while (1) {

    pcntl_signal_dispatch();

    fprintf(STDOUT, "pid = %d, main process doing something ... \n", posix_getpid());

    sleep(1);

}
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072,我接收到一个信号:2 
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072, main process doing something ... 
pid = 2073, main process doing something ... 
pid = 2072, main process doing something ... 
pid = 2073,我接收到一个信号:2 
pid = 2073, main process doing something ...

子进程也可以重设信号处理程序。


function sigHandler($signo)
{
    fprintf(STDOUT, "pid = %d,我接收到一个信号:%d \n", posix_getpid(), $signo);
}

pcntl_signal(SIGINT, 'sigHandler');

$pid = pcntl_fork();

if (0 === $pid) {
    pcntl_signal(SIGINT, function ($signo)
    {
        fprintf(STDOUT, "pid = %d,我是子进程,我重设了信号处理程序:%d \n", posix_getpid(), $signo);
    });
}

while (1) {

    pcntl_signal_dispatch();

    fprintf(STDOUT, "pid = %d, main process doing something ... \n", posix_getpid());

    sleep(1);

}
...
pid = 2088, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2088, main process doing something ... 
pid = 2088,我接收到一个信号:2 
pid = 2088, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2088, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2088, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2088, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2088, main process doing something ... 
pid = 2089, main process doing something ... 
pid = 2089,我是子进程,我重设了信号处理程序:2 
...