收藏此站 联系我们 宿迁腾云网络公司
全部 网站建设 SEO优化 技术日志
当前位置:网站首页 > 技术日志

PHP7之间的通讯进程与信号

作者: 腾云网络 . 阅读量: . 发表时间:2019-11-08

信号

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

代码演示

<?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";

运行结果

PHP7之间的通讯进程与信号(图1)

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

declare(ticks = 10)

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



标签:
转载请注明来源:https://www.tyweb.net/news/243.html
下一篇:没有了
现在咨询免费送诊断方案,每天限3名
马上填写资料获取方案
腾云网络产品
网站建设 微信小程序 微商城 APP开发 SEO优化
腾云网络服务
7x24小时售后支持 市内上门服务 免费后台培训 定期回访
关于腾云网络
关于我们
网站建设案例 小程序案例 APP开发案例
联系腾云网络
联系腾云网络
紧急问题处理电话
131-6035-5545 131-6035-5545
131-6035-5545
扫一扫关注腾云网络公众号