我是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"));
这似乎意味着它在许多地方都没有正确地重新启动系统调用。我错过了什么吗?对我来说,部分读取中断情况似乎比无读取情况更常见,并且随着请求读取量的增加而越来越多。
答案 0 :(得分:1)
但是如果在只读取一些数据时它被中断,则功能读取的次数少于所要求的数据。
您对此主题的理解不完整。您将要仔细阅读此man page("信号处理程序"系统调用和库函数的中断)。
特别注意"慢"之间的区别。设备和本地磁盘(假设速度很快)。
这似乎意味着它在很多地方都没有正确地重新启动系统调用。
如果读取来自"快速"使用了设备和SA_RESTART
,然后系统调用将自动重启,并且不能进行部分读取。