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

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
雷峰网
雷峰网
博客园_首页
小众软件
小众软件
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
MyScale Blog
MyScale Blog
U
Unit 42
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 叶小钗

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 5-3 会话 2021-03-25 「PHP架构师」面试准备 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-2 编写中断信号处理程序 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课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇
4-3 信号集
王二 · 2022-03-15 · via WangDeer

中断处理过程示意图

信号集

信号集是指信号的集合。

主程序可以选择阻塞某些信号,被阻塞的信号集称为阻塞信号集。

当进程阻塞了某个信号(通过 pcntl_sigpromask 来设置信号屏蔽字),如果在运行期间接收到了阻塞的信号时,这个信号的处理程序不会被执行,这个信号会放在被挂起的信号集里(信号未决集)。

sigpending

PHP 没有实现这个函数。

examine pending signals.

sigpending() returns the set of signals that are pending for delivery to the calling thread (i.e., the signals which have been raised while blocked).

The mask of pending signals is returned in set.

pcntl_sigpromask

pcntl_sigpromask 设置或检索阻塞信号,用来增加,删除或设置阻塞信号,具体行为 依赖于参数how。

pcntl_sigprocmask(int $how, array $set, array &$oldset = ?): bool

参数:

how:

设置 pcntl_sigprocmask()函数的行为。 可选值:

  • SIG_BLOCK: 把信号加入到当前阻塞信号中。
  • SIG_UNBLOCK: 从当前阻塞信号中移出信号。
  • SIG_SETMASK: 用给定的信号列表替换当前阻塞信号列表。

set:

信号列表。

oldset:

是一个输出参数,用来返回之前的阻塞信号列表数组。

返回值:

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

示例:

<?php

pcntl_signal(SIGINT, function($signo){

    fprintf(STDOUT, "pid=%d 接收到了信号:%d\n", getmypid(), $signo);
});

// 设置进程的信号屏蔽字|信号阻塞集
$sigset = [SIGINT, SIGUSR1];
pcntl_sigprocmask(SIG_BLOCK, $sigset);

$i = 10;
while ($i--){

    pcntl_signal_dispatch();
    fprintf(STDOUT, "pid=%d do something...\n", getmypid());

    sleep(1);

    if ($i == 5){

        fprintf(STDOUT, "时间到,准备解除阻塞...\n");
        //解除信号屏蔽
        //$oldset 会返回之前阻塞的信号集|信号屏蔽字
        pcntl_sigprocmask(SIG_UNBLOCK, [SIGINT,SIGUSR1], $oldset);

        print_r($oldset);

    }
}

$ php demo13.php 
pid=2673 do something...
^C^Cpid=2673 do something...
# 按 ctrl + c  信号被屏蔽阻塞
^C^C^C^C^Cpid=2673 do something...
^C^C^Cpid=2673 do something...
pid=2673 do something...
时间到,准备解除阻塞...
Array
(
    [0] => 2
    [1] => 10
)
pid=2673 接收到了信号:2
pid=2673 do something...
^Cpid=2673 接收到了信号:2
# 解除阻塞后,按 ctrl + c 接收到信号并处理
pid=2673 do something...
^Cpid=2673 接收到了信号:2
pid=2673 do something...
^Cpid=2673 接收到了信号:2
pid=2673 do something...
^Cpid=2673 接收到了信号:2
pid=2673 do something...