<?php
class test{
private $son_num = 4;
private $son_list = [];
public function start()
{
for($i = 0;$i < $this->son_num;$i++){
$this->fork();
}
//kill -10 的信号
pcntl_signal(SIGUSR1, [$this, 'sigHandler'], false);
//control + c 的信号
pcntl_signal(SIGINT,[$this,'sigHandler'],false);
while (1) {
pcntl_signal_dispatch();
}
}
public function sigHandler($sign){
echo "接收到信号:{$sign}\n";
switch($sign){
case 10:
foreach($this->son_list as $son_pid){
posix_kill($son_pid,SIGKILL);
unset($this->son_list[$son_pid]);
echo "已关闭子进程:{$son_pid}\n";
$this->fork();
}
break;
case 2:
foreach($this->son_list as $son_pid){
posix_kill($son_pid,SIGKILL);
unset($this->son_list[$son_pid]);
echo "已关闭子进程:{$son_pid}\n";
}
exit;
break;
default :
echo "接收到未知信号:{$sign}\n";
exit;
}
}
public function fork()
{
$pid = pcntl_fork();
if($pid > 0){
$this->son_list[$pid] = $pid;
echo posix_getpid()."创建子进程:{$pid}\n";
}else if($pid < 0){
die('创建子进程失败!');
}else{
while(true){
echo "啦啦啦,我是子进程:".posix_getpid()."\n";
sleep(1000);
}
exit;
}
}
public function sign(){
pcntl_signal(SIGUSR1, [$this, 'sigHandler'], false);
}
}
(new test)->start();