请教一下,在workerman发送信号SIGINT给主进程,主进程(pcntl_wait)会立刻收到信号并执行信号处理函数,
我模拟了下,主进程(pcntl_wait)会一直阻塞,并不会立刻执行信号处理函数,信号已经注册入队列当中了。假设我发送了好几次信号,最终如果按control+c中断的时候,就会输出这几次信号的处理函数。
首先感谢BOSS:),希望知道workerman是如何处理的,我看了好多次,还是找不出所以然-。-,太笨了。
代码如下
function stopAll($sig){
echo "master has a sig $sig\n" ;
global $pid ;
echo $pid."\n" ;
if($pid > 0) {
posix_kill($pid,$sig) ;
}
}
$pid = pcntl_fork();
if($pid > 0)
{
pcntl_signal(SIGINT,'stopAll') ;
$epid = pcntl_wait($status,WUNTRACED);
$id = getmypid();
echo "parent process {$id}, child process {$pid}\n";
if($epid){
echo "child $epid exit \n" ;
}
pcntl_signal_dispatch();
}
else
{
$id = getmypid();
echo "child process,pid {$id}\n";
while(1){
sleep(2) ;
}
}
我发送了好几次信号,仍然阻塞,最后以control+c中断输出如下:
qmoredeMacBook-Pro:120.25.105.202 Qmore$ php recive_sig.php
child process,pid 24793
^[[A^Cmaster has a sig 2
24793
master has a sig 2
24793
master has a sig 2
24793
master has a sig 2
24793
master has a sig 2
24793
parent process 24792, child process 24793
child 24793 exit