信号重装问题

dojack

刚学workerman,在看源码过程中,对信号重装不大明白!
1、为什么子进程中要做下信号重装?
2、为什么重装时先是使用pcntl_signal(SIGINT, SIG_IGN, false) 取消安装信号, 再使用self::$globalEvent->add(SIGINT, EventInterface::EV_SIGNAL, array('\Workerman\Worker', 'signalHandler'))安装新信号?两种信号安装方式有啥区别呢?

3324 3 0
3个回答

walkor

主进程是通过pcntl_signal设置的信号,子进程是通过eventLoop安装的信号,二者有可能冲突,所以在子进程中先pcntl_signal(SIGINT, SIG_IGN, false) 取消安装信号

  • 暂无评论
yurius

刚测试过,pcntl_signal安装的信号对进入事件循环的子进程无效,必须通过Event->add(SIGINT, Libevent::EV_SIGNAL)安装信号,子进程才会响应请问何解?谢谢!

  • 暂无评论
walkor

pcntl_signal安装信号处理函数后,如果进程收到对应信号,需要以下条件之一才能触发。
1、代码段中声明了declare(ticks=1);
2、代码中调用pcntl_signal_dispatch时
workerman本身没有使用declare(ticks=1);,所以1不会满足。而pcntl_signal_dispatch也只是在使用select事件库会用到。如果使用libvent或者event事件库,则pcntl_signal_dispatch也不会被调用,所以子进程里pcntl_signal设置的信号处理函数在使用libvent或者event事件库时永远不会触发。

  • 暂无评论
年代过于久远,无法发表回答
🔝