Workerman 中 Worker::stopAll(); Master进程中为什么要增加一个Timer::add() 去清理残留pid数据?

meows
Timer::add(1, "\\Workerman\\Worker::checkIfChildRunning");

/**
* check if child processes is really running
*/
public static function checkIfChildRunning()
{
    foreach (static::$_pidMap as $worker_id => $worker_pid_array) {
    foreach ($worker_pid_array as $pid => $worker_pid) {
        if (!\posix_kill($pid, 0)) {
        unset(static::$_pidMap[$worker_id][$pid]);
        }
    }
  }
}

 $pid = \pcntl_wait($status, \WUNTRACED);
 // Calls x handlers for pending signals again.
 \pcntl_signal_dispatch();
  if($pid > 0)
  {
    // ....
        // Clear process data.
        unset(static::$_pidMap[$worker_id][$pid]);
    // ....
  }

主进程,检查子进程是否全部退出,然后清理子进程残留数据。这里通过添加定时器去检测是否运行,子进程退出后,主进程的pcntl_wait 不是会收到退出pid 然后进行清理。
那么为什么还要额外添加定时器去清理呢?这个定时器在主进程退出的时候也没有进行Timer::del($timer_id) 呢???

阅读 292
1个回答

six

Linux下信号可能会丢失的,而pcntl_wait 是等待SIGCHLD信号,所以pcntl_wait 可能会

  • meows 2021-11-06

    清理残留PID定时器,为何在退出主进程的时候,没有删除掉呢?

  • six 2021-11-06

    不知道了。进程退出了什么都销毁了,定时器也就没了吧