【发布时间】:2016-03-03 15:16:17
【问题描述】:
我是 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"));
这似乎意味着它在许多地方都没有正确地重新启动系统调用。我错过了什么吗?在我看来,部分读取中断的情况似乎比尚未读取的情况更常见,并且随着读取请求的数量越来越大。
【问题讨论】: