前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP进程间通信-信号

PHP进程间通信-信号

作者头像
猿哥
发布2019-11-10 16:36:11
7380
发布2019-11-10 16:36:11
举报
文章被收录于专栏:Web技术布道师Web技术布道师

信号

信号是一种系统调用。通常我们用的kill命令就是发送某个信号给某个进程的。具体有哪些信号可以在liunx/mac中运行 kill -l 查看。下面这个例子中,父进程等待5秒钟,向子进程发送sigint信号。子进程捕获信号,调信号处理函数处理。

代码演示
代码语言:javascript
复制
<?php
$childList = [];
$parentId = posix_getpid();

//信号处理函数
function signHandler($sign){
    $pid = posix_getpid();
    exit("process:{$pid},is killed,signal is {$sign}\n");
}

$pid = pcntl_fork();
if ($pid == -1){
    // 创建子进程失败
    exit("fork fail,exit!\n");
}elseif ($pid == 0){
    //子进程执行程序
    //注册信号处理函数
    declare(ticks = 10);
    pcntl_signal(SIGINT,"signHandler");//注册SIGINT信号处理函数
    $pid = posix_getpid();
    while (true){
        echo "child process {$pid},is running.......\n";
        sleep(1);
    }
}else{
    $childList[$pid] = 1;
    sleep(5);
    posix_kill($pid,SIGINT);//向指定进程发送一个信号
}

// 等待子进程结束
while(!empty($childList)){
    $pid = pcntl_wait($status);
    if ($pid > 0){
        unset($childList[$pid]);
    }
}

echo "The child process is killed by parent process {$parentId}\n";

运行结果

当父进程没有发送信号的时候,子进程会一直循环输出‘child process is running...’,父进程发送信号后,子进程在检查到有信号进来的时候调用对应的回调函数处理退出了子进程。

declare(ticks = 10)

这里的ticks=10,可以理解为程序执行10条低级语句后,检查看有没有未执行的信号,有的话就去处理。

关于 declare(ticks = n) 的详细讲解可以参考 (https://my.oschina.net/Jacker/blog/32936)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档