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

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
宝玉的分享
宝玉的分享
G
Google Developers Blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
V
Visual Studio Blog
博客园 - Franky
S
SegmentFault 最新的问题
Jina AI
Jina AI
爱范儿
爱范儿
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
C
Check Point Blog
月光博客
月光博客
P
Proofpoint News Feed
T
The Blog of Author Tim Ferriss
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
Martin Fowler
Martin Fowler

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...