sigint信号 php,PHP进程间通信操作——信号

信号

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

代码演示

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

运行结果

91c37a8907b73efd3ab5b2d0a9b3d88d.png

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

declare(ticks = 10)

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

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

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值