是否有可能read以
从常规文件读取时,不包括:
read(3)建议除上述条件外,从常规文件中读取数据时,read返回的字节数永远不会少于请求的字节数。
如果文件中剩余的字节数小于nbyte,read()请求被信号中断,或者文件是管道或FIFO或特殊文件且小于,则返回的值可能小于nbyte。 nbyte个字节立即可供读取。
但是,此答案提出了一个假设,即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
}
Run Code Online (Sandbox Code Playgroud)
此外,我从未经历过对常规文件的读取以进行阻止,但是我假设在发生可恢复的I / O错误(例如需要多次重读的坏块)的情况下,这是有可能的。
一种简短读取方法(除了问题中提到的情况)是在读取过程中是否发生I / O错误。
例如,假设您有一个大小为1024的常规文件,它占用两个512字节的扇区。您不知道的第二个扇区是坏的,无法读取。打开文件并执行操作read(fd, buf, 1024)将返回512并且不会设置errno。如果您尝试读取一次,你得到的返回值-1和errno = EIO。
我能够使用设备映射器的error功能在Linux上进行测试。
由于您的程序无法采取任何措施来排除I / O错误的可能性,因此这意味着永远不能肯定地认为,任何正返回值都read必须表示您读取了所需的字节数。