剛學(xué)workerman,在看源碼過程中,對(duì)信號(hào)重裝不大明白!
1、為什么子進(jìn)程中要做下信號(hào)重裝?
2、為什么重裝時(shí)先是使用pcntl_signal(SIGINT, SIG_IGN, false) 取消安裝信號(hào), 再使用self::$globalEvent->add(SIGINT, EventInterface::EV_SIGNAL, array('\Workerman\Worker', 'signalHandler'))安裝新信號(hào)??jī)煞N信號(hào)安裝方式有啥區(qū)別呢?
剛測(cè)試過,pcntl_signal安裝的信號(hào)對(duì)進(jìn)入事件循環(huán)的子進(jìn)程無效,必須通過Event->add(SIGINT, Libevent::EV_SIGNAL)安裝信號(hào),子進(jìn)程才會(huì)響應(yīng)請(qǐng)問何解?謝謝!
pcntl_signal安裝信號(hào)處理函數(shù)后,如果進(jìn)程收到對(duì)應(yīng)信號(hào),需要以下條件之一才能觸發(fā)。
1、代碼段中聲明了declare(ticks=1);
2、代碼中調(diào)用pcntl_signal_dispatch時(shí)
workerman本身沒有使用declare(ticks=1);,所以1不會(huì)滿足。而pcntl_signal_dispatch也只是在使用select事件庫(kù)會(huì)用到。如果使用libvent或者event事件庫(kù),則pcntl_signal_dispatch也不會(huì)被調(diào)用,所以子進(jìn)程里pcntl_signal設(shè)置的信號(hào)處理函數(shù)在使用libvent或者event事件庫(kù)時(shí)永遠(yuǎn)不會(huì)觸發(fā)。