glibc和系统调用被信号中断

时间:2016-03-03 15:16:17

标签: linux unix signals glibc

我是Linux的新手,我正在学习系统调用和信号。例如,read系统调用可以被信号中断。如果在阅读任何内容之前它被中断,则会失败并将errno设置为EINTR。在glibc中,这主要由TEMP_FAILURE_RETRY宏处理。但是如果在只读取一些数据时它被中断,则功能读取的次数少于请求的次数。在这种情况下,调用者应该为缺失部分发出另一个read,继续执行此操作直到读取所有数据。然而,glibc源包含许多这样的调用:

if (TEMP_FAILURE_RETRY (read (fd, &word, 4)) != 4)
    error (EXIT_FAILURE, errno, _("cannot read header"));

这似乎意味着它在许多地方都没有正确地重新启动系统调用。我错过了什么吗?对我来说,部分读取中断情况似乎比无读取情况更常见,并且随着请求读取量的增加而越来越多。

1 个答案:

答案 0 :(得分:1)

  

但是如果在只读取一些数据时它被中断,则功能读取的次数少于所要求的数据。

您对此主题的理解不完整。您将要仔细阅读此man page("信号处理程序"系统调用和库函数的中断)。

特别注意"慢"之间的区别。设备和本地磁盘(假设速度很快)。

  

这似乎意味着它在很多地方都没有正确地重新启动系统调用。

如果读取来自"快速"使用了设备和SA_RESTART,然后系统调用将自动重启,并且不能进行部分读取。