信号集也就是信号的集合。通俗来讲就是一堆信号,而信号屏蔽字也就是屏蔽信号的集合
当你编写程序,想要屏蔽某个或多个信号的时候,那么我们就会用到PHP扩展中的pcntl_sigprocmask函数,这个函数就是用于设置信号屏蔽字的函数,第一个参数就是可以是否设置屏蔽信号字,SIG_BLOCK 是设置,SIG_UNBLOCK是移除不设置
第二个参数就是你要设置屏蔽的信号集合数组,第三个参数是返回之前设置屏蔽的信号集数组
如果不知道怎么用PHP编写信号处理程序的同学,可以查看我上面的一篇文章教程
如何用PHP编写一个信号中断处理程序(https://www.umdzz.cn/article/56/php)
function sigHandler($signo)
{
echo "我捕捉到一个信号,信号编号是:".$signo.PHP_EOL;
}
pcntl_signal(SIGINT,'sigHandler');
//要屏蔽的信号数组
$sigArray = [SIGINT,SIGUSR1];
//设置信号屏蔽字
pcntl_sigprocmask(SIG_BLOCK,$sigArray);
while (1){
//调用等待信号的处理器
pcntl_signal_dispatch();
echo "主进程正在运行,当前进程的编号是:".posix_getpid().PHP_EOL;
sleep(1);
};
将代码上传到服务器进行测试
测试发现,我们使用Ctrl+C 或者 用kill 发送SIGINT 命令,都是不起作用的,因为信号已经被屏蔽了
function sigHandler($signo)
{
echo "我捕捉到一个信号,信号编号是:".$signo.PHP_EOL;
}
pcntl_signal(SIGINT,'sigHandler');
//要屏蔽的信号数组
$sigArray = [SIGINT,SIGUSR1];
//设置信号屏蔽字
pcntl_sigprocmask(SIG_BLOCK,$sigArray);
$i = 10 ;
while ($i--){
//调用等待信号的处理器
pcntl_signal_dispatch();
echo "主进程正在运行,当前进程的编号是:".posix_getpid().PHP_EOL;
sleep(1);
if($i==5)
{
//解除信号屏蔽字
pcntl_sigprocmask(SIG_UNBLOCK,[SIGINT],$data);
echo "时间到了,准备解除信号屏蔽字".PHP_EOL;
var_dump($data);
}
};
将代码上传到服务器再次进行测试
经过测试后发现,在i>5的时候,程序是接收不到我们发送的信号的,当i=5,我们解除信号屏蔽字后,我们的程序是可以正常接收到我们的信号屏蔽字的,并且也打印出了,我之前之前测试的信号屏蔽字,SIGINT和SIGUSR1 ,如果不了解的同学,可以 通过 kill -l
命令来查看
本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.amdzz.cn
最新评论