old post from wiznote

一句话说出主题

当进行socket read时,进程并不会因为收到signal要求退出而就直接答应退出。

背景

php 程序接收mysql binlog。

问题

解题

因为有两套数据源,本地和测试环境。当连接本地mysql,就无法kill掉。连接测试mysql,就可以kill掉。这是个坑点,当时不能理解。

通过打印日志发现:

如上,我发现了问题的核心:

虽然还不能100%解释所有问题,但现在突破点有了,即第一点。那么现在来验证这个:system call可以不回应signal

首先,根据所得知识,是可以显式让syster call来回应的,这是可以配置的(通过设置RESTART标记位)。C语言中,可以用sigaction,php中没有找到对应的函数。但是pcntl_signal本身提供了第三个参数来开控制。默认是true,也就是说默认不回应signal call(自动重启,不退出)。

现在,把代码中pcntl_signal加上第三个参数,运行,执行kill -QUIT pid,成功!进程退出;同时提示Warning: socket_read(): unable to read from socket [4]: Interrupted system call in。如此,确实是接收到了signal,并且回应了。