缘起
当给进程安装一个信号处理程序,如果一个进程在执行一个系统调用的时候,突然收到一个信号,然后转到信号处理程序,当执行完信号处理程序后,系统调用会继续进行吗?
解答
不管在C还是其他语言,都有一个可选的方式,比如在PHP中,pcntl_signal有第三个参数(默认为true),可以继续未完成的系统调用(默认),也可以让系统调用返回失败(第三个参数设置为false);
这在有些时候是需要关心的,比如,fpm在退出的时候,先发送一个信号到每个子进程,子进程收到信号后不是立即死掉,而是先关闭输入,停止accept,然后设置 in_shutdown = 1; 然后信号处理例程执行完毕,返回继续原来的工作(如果原来在执行系统调用,则返回原来的系统调用),执行完一次请求后发现in_shutdown==1 则执行退出