是否有可能read
to
从常规文件读取时,不包括:
- 请求超过 SSIZE_MAX 的数据
- 读取超出 EOF 的内容
- 信号中断
read(3)
表明,排除上述条件,从常规文件读取时read
永远不会返回少于请求的字节数。
如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,或者如果文件是管道、FIFO 或特殊文件并且少于 nbyte,则返回的值可能小于 nbyte nbyte 字节立即可供读取。
然而,这个答案 https://stackoverflow.com/a/10179298/2626865提出一个假设,其中read
如果内核希望优先考虑其他 I/O,则返回的字节数可能少于请求的字节数。虽然是假设,但要点是,在任何条件下都无法读取预期返回与请求的数据完全相同的数据。因此,即使上述三个条件(SSIZE_MAX、EOF、中断)不适用,使用它也绝不安全read
在常规文件上而不检查返回值:
// all blockable signals have been ignored
// 10 is guaranteed less than SSIZE_MAX
// file size is known, access is locked
if (read(fd_of_big_reg_file_with_zero_offset, buf, 10) < 0) {
// so all we have to do is handle errors
}
此外,我从未经历过对常规文件的读取被阻止,但我认为在发生可恢复的 I/O 错误时这是可能的,例如需要多次重新读取的坏块。
进行简短读取的一种方法(除了您问题中提到的情况之外)是在读取过程中发生 I/O 错误。
例如,假设您有一个大小为 1024 的常规文件,占用两个 512 字节的扇区。您不知道的是,第二个扇区已损坏并且无法读取。打开文件并执行read(fd, buf, 1024)
将返回 512 并且不会设置errno
。如果你尝试阅读again,你得到的返回值为-1
and errno = EIO
.
我能够使用设备映射器在 Linux 上测试这一点error
功能。
由于您的程序无法执行任何操作来排除 I/O 错误的可能性,这意味着永远不能安全地假设来自read
必须意味着您读取了请求的尽可能多的字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)