php 父进程,php父子进程通信

多进程demo里介绍过,如何fork子进程。 但是,谁家的孩子谁管,你fork了得记得处理啊,不然哪天捣点乱啥的,是吧。 进程与进程之间通信的方式有很多种,这里用最简单的信号通信。当我们kill -9 一个进程的时候,实际上就是向该进程发送一个终止信号,之前已

多进程demo里介绍过,如何fork子进程。

但是,谁家的孩子谁管,你fork了得记得处理啊,不然哪天捣点乱啥的,是吧。

进程与进程之间通信的方式有很多种,这里用最简单的信号通信。当我们kill -9 一个进程的时候,实际上就是向该进程发送一个终止信号,之前已经绑定了信号处理器,所以,我们可以用其他进程通知另一个进程做出相应的反应(kill -9 的时候是退出)。父子进程通信也不例外,父进程绑定信号处理器,用来协调子进程,子进程向父进程发送信号,让父进程有相应的反应。

绑定信号处理器:pcntl_signal http://cn2.php.net/manual/en/function.pcntl-signal.php#70161

发送信号:posix_kill http://cn2.php.net/manual/en/function.posix-kill.php

需要注意一点,信号的不可重入性,当一个子进程的信号处理器正处理时,将忽略其他的信号处理。所以,需要pcntl_watipid

http://cn2.php.net/manual/en/function.pcntl-waitpid.php 来等待。

运用上边的理论,实现了一个固定子进程处理任务的程序:

父进程fork子进程,然后绑定SIGCHLD信号,子进程结束触发父进程的SIGCHLD信号处理器,末尾主循环,统计子进程的个数,当低于指定值时,fork新的子进程:代码如下:

0 ) {

if($signal == SIGCHLD){

$child_nums--;

}

}

}

function fork_do($c){

global $child_nums;

while($c--) {

if(pcntl_fork() == 0 ) {

real_do();

} else {

$child_nums++;

}

}

}

function real_do(){

sleep(rand(1,3));

exit();

}

$manage_pid = getmypid();

$fork_nums = 4;

pcntl_signal(SIGCHLD,'catch_signal');

fork_do($fork_nums);

while($child_nums != 0){

echo "Childs " . $child_nums . "\n";

if($child_nums < $fork_nums) {

fork_do($fork_nums - $child_nums);

}

}

注:要看动态效果显得很酷的话,把sleep改成usleep或者干脆去掉吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值