protected static function monitorWorkers()
{
self::$_status = self::STATUS_RUNNING;
while (1) {
// Calls signal handlers for pending signals.
pcntl_signal_dispatch();
// Suspends execution of the current process until a child has exited, or until a signal is delivered
$status = 0;
$pid = pcntl_wait($status, WUNTRACED);
// Calls signal handlers for pending signals again.
pcntl_signal_dispatch();
。。。。。
}
pcntl_signal_dispatch是檢察是否有未處理的信號,如果有的話調(diào)對應(yīng)信號的回調(diào)函數(shù)。
pcntl_wait是進入睡眠,如果有子進程退出事件或者其它信號事件就會被喚醒返回,程序繼續(xù)向下執(zhí)行。
pcntl_wait返回后 首先pcntl_signal_dispatch檢查,然后處理子進程退出事件(如果有進程退出的話)。
處理進程退出事件過程中可能會有新的信號到來,在沒有調(diào)用pcntl_signal_dispatch時這些信號不會被處理,所以在下次pcntl_wait是進入睡眠前再檢查一遍,避免后來的信號沒有被處理。
請問那是不是pcntl_signal_dispatch()就檢測到一次有信號后,就結(jié)束了。如果在繼續(xù)監(jiān)聽的話,就需要在pcntl_signal_dispatch()一次?
對這個pcntl_signal_dispatch不是很好的理解,是一直監(jiān)聽系統(tǒng)是否有信號發(fā)送過來,還是監(jiān)聽到了一次后,就結(jié)束了