linux signal sigaction 处理被中断的系统调用

本文从WordPress迁移而来, 查看全部WordPress迁移文章

在看书和写代码的时候遇到的一个疑惑,做个记录

《unix网络编程》提到了信号处理;另外提到了当进程阻塞于某个慢系统调用时,此时捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。有些内核自动某些重启被中断的系统调用

书中的程序是自行编写了一个signal函数,其内部其实是调用了sigaction,没有设置SA_RESTART,此signal和系统的signal不是同一个东西

当使用书中的signal来捕获并处理信号的时候,发现accept发生了中断(用系统的 perror() 打印了错误信息)

但是换成了 系统的 signal函数的时候,accept的反应,是无声无息的————它即没有发生EINTR错误,并且还能正常工作,继续accept其他客户端

对此的猜测是:使用系统signal的时候,accept发生了中断,内核自动恢复了accept调用

随后,将书上的signal进行改写,设置了 SA_RESTART, act.sa_flags |= SA_RESTART;

在运行程序的时候,发现运行结果了 调用系统signal时的结果一模一样,程序并没有打印EINTR错误,并且还能正常工作

虽然没有得到确切的验证(找不着资料),但是单从运行结果来看,姑且认为猜测是正确,即系统的signal是默认设置了SA_RESTART功能的,内核会自动重启被中断的系统调用