在Swoole
内核里面,有多种线程。比如说心跳线程(心跳线程我们会在未来的版本进行移除),reactor
线程,中断检查线程等等。
那么,在信号的管理方面,Swoole
又是怎么做的呢?我们又如下规则:
1 | 1. 如果是异常产生的信号(比如程序错误,像SIGPIPE、SIGEGV这些),则只有产生异常的线程收到并处理。 |
那么Swoole
是如何实现阻塞信号的呢?它提供了一个叫做swSignal_none
的函数:
1 | void swSignal_none(void) { |
其中,
1 | sigfillset(&mask); |
表示设置所有的信号。
1 | int ret = pthread_sigmask(SIG_BLOCK, &mask, nullptr); |
表示对所有的信号进行阻塞。
我们发现,Swoole
对心跳线程、中断检查线程等线程调用了swSignal_none
。因为Swoole
不希望这些线程去处理信号以及被这些信号打扰。具体哪些地方调用了swSignal_none
,感兴趣的小伙伴可以看一看源码。