PHP 进程间通信---信号篇

【1、信号】

对于Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。

1、信号的种类

这里列举1-31号信号。剩余的信号请查看kill -l

编号信号名称默认动作说明
1SIGHUP进程终止终止控制终端或进程
2SIGINT进程终止键盘产生的中断(Ctrl+C)
3SIGQUIT进程终止键盘产生的退出
4SIGILL进程终止非法指令
5SIGTRAP进程终止debug中断
6SIGABRT/SIGIOT进程终止发生异常终止
7SIGBUS/SIGEMT进程终止总线异常/EMT指令
8SIGFPE进程终止浮点运算溢出
9SIGKILL进程终止强制进程终止
10SIGUSR1进程终止用户信号,进程可自定义用途
11SIGSEGV进程终止非法内存地址引用
12SIGUSR2进程终止用户信号,进程可自定义用途
13SIGPIPE进程终止向某个没有读取的管道中写入数据
14SIGALRM进程终止时钟中断(闹钟)
15SIGTERM进程终止进程终止
16SIGSTKFLT进程终止协处理器栈错误
17SIGCHLD忽略子进程退出或中断
18SIGCONT继续运行如进程停止状态则开始运行
19SIGSTOP进程暂停停止进程运行
20SIGSTP进程暂停键盘产生的停止
21SIGTTIN进程暂停后台进程请求输入
22SIGTTOU进程暂停后台进程请求输出
23SIGURG忽略socket发生紧急情况
24SIGXCPU进程终止CPU时间限制被打破
25SIGXFSZ进程终止文件大小限制被打破
26SIGVTALRM进程终止虚拟定时时钟
27SIGPROF进程终止profile timer clock
28SIGWINCH忽略窗口尺寸调整
29SIGIO/SIGPOLL进程终止I/O可用
30SIGPWR进程终止电源异常
31SIGSYS/SYSUNUSED进程终止系统调用异常

* :Linux操作系统定义的62个信号,每个信号都有对应的一个编号和宏定义名称,这些宏定义可以在 kill - l 中找到。其中1-31号信号为普通信号34-64号信号为实时信号,一旦发出信号则立即去处理。

 

 

【2、 PHP如何给进程安装信号处理】

 

php版本低于5.3时的策略思路:每次执行一条语句检测是否有信号发送给程序;由于不知道什么时候会有信号过来,所以需要逐步检查,导致效率很低

<?php

//设置每次执行一条语句检测是否有信号
declare(ticks=1);
//注册信号处理函数
register_tick_function('sigal');
//根据信号处理逻辑
function sigal($sigal)
{
   echo $sigal;
}

while(1)
{
  sleep(1);
}

php版本在5.3以后 7以下的时候采取的是  pcntl_signal_dispatch 

<?php

//注册当前进程的信号处理
pcntl_signal_dispatch();

//注册 发生SIGINT 对应的处理逻辑
pcntl_signal(SIGINT,function(){
    
   //to do...
});

while(true)
{
   sleep(1);
}

php版本在7以后 采取的是异步处理 (效率最高)

<?php

//设置当前进程信号异步处理
pcntl_async_signals(true);

pcntl_signal(SIGINT,function(){
   
    //to do ...
});

while(true)
{
    sleep(1);
}

 

 

【3、简单举例】

需求:程序在30秒后自动退出(php7版本);

<?php
//注册当前异步处理信号模块
pcntl_async_signals(true);

//注册自定义信号
pcntl_signal(SIGUSR1,function(){
    echo '出发了自定义信号,进程执行退出'.PHP_EOL;
    posix_kill(getmypid(),SIGQUIT);
});

//设定初始时间
$time=0;

while(true)
{
    //如果大于30秒就触发自定义信号
    if($time>30) posix_kill(getmypid(),SIGUSR1);
    sleep(1);
    $time++;
}

22b41c01924caeba78f84af0c7a20e4fc4f.jpg

过了30秒后,进程执行退出。

 

【4、注意事项】

注意: 9号信号 不可被捕捉。 系统保留用于强制退出进程;

转载于:https://my.oschina.net/u/4173863/blog/3098564

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值