UNIX lseek/读/写行为

Bru*_*uce 1 unix linux file-io seek

如果我有一个大小为 5 的文件,我使用 lseek 查找位置 10,然后使用 read 从该位置读取 1 个字节,则 read 系统调用的返回值为 0。我想知道 lseek/read/ 的返回值在以下情况下写入:如果我查找超过文件系统允许的最大文件大小,然后执行读取。我们可以找到这个位置吗/这是一个错误吗?如果不是,如果我在这里进行读取,读取的返回值是什么?0还是-1?

pax*_*blo 5

POSIX规范lseek()规定您可以设置超出文件末尾的位置:

lseek() 函数应允许将文件偏移量设置为超出文件中现有数据的末尾。

off_t它仅在结果位置超出从返回的变量类型的范围时才会抱怨lseek()。似乎没有指定错误消息来指示“超出特定于进程的限制”或“超出文件系统本身的容量”之类的内容。


但是,根据 POSIX ,在使用 a 进行查找之后尝试扩展文件write()可能会返回EFBIG错误代码。最好的办法是实际尝试一下,看看行为是什么,特别是因为 Linux 不一定在所有情况下都符合 POSIX - 换句话说,符合 POSIX 的 UNIX 系统和 Linux 之间的行为可能不同。


POSIX规范对所发生read()情况非常严格:

当前文件结尾之后不得进行任何数据传输。如果起始位置位于文件末尾或之后,则返回 0。

因此,您应该返回零,因为根据定义,如果您完成了lseek()超出文件系统容量的操作,那么您肯定超出了文件末尾(您不能创建大于文件系统允许的文件)。