刚学workerman,在看源码过程中,对信号重装不大明白! 1、为什么子进程中要做下信号重装? 2、为什么重装时先是使用pcntl_signal(SIGINT, SIG_IGN, false) 取消安装信号, 再使用self::$globalEvent->add(SIGINT, EventInterface::EV_SIGNAL, array('\Workerman\Worker', 'signalHandler'))安装新信号?两种信号安装方式有啥区别呢?
主进程是通过pcntl_signal设置的信号,子进程是通过eventLoop安装的信号,二者有可能冲突,所以在子进程中先pcntl_signal(SIGINT, SIG_IGN, false) 取消安装信号
刚测试过,pcntl_signal安装的信号对进入事件循环的子进程无效,必须通过Event->add(SIGINT, Libevent::EV_SIGNAL)安装信号,子进程才会响应请问何解?谢谢!
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事件库时永远不会触发。
主进程是通过pcntl_signal设置的信号,子进程是通过eventLoop安装的信号,二者有可能冲突,所以在子进程中先pcntl_signal(SIGINT, SIG_IGN, false) 取消安装信号
刚测试过,pcntl_signal安装的信号对进入事件循环的子进程无效,必须通过Event->add(SIGINT, Libevent::EV_SIGNAL)安装信号,子进程才会响应请问何解?谢谢!
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事件库时永远不会触发。