UNIX lseek /读/写行为

时间:2013-01-15 00:18:50

标签: linux unix file-io seek

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

1 个答案:

答案 0 :(得分:3)

POSIX specs for lseek()表示您可以将位置设置在文件末尾之外:

  

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

它只会抱怨结果位置是否超出off_t返回的lseek()变量类型的范围。似乎没有指定错误消息,表示“超出您的特定于进程的限制”或“超出文件系统本身的容量”。


但是,尝试使用write()进行搜索后扩展文件可能会再次EFBIG错误代码according to POSIX。最好的办法是实际尝试这一点并查看行为是什么,尤其是,因为Linux在所有情况下都不一定符合POSIX - 换句话说,POSIX兼容UNIX之间的行为可能不同系统和Linux。


POSIX read() specs对发生的事情非常坚定:

  

在当前文件结束之后不会发生数据传输。如果起始位置在文件结尾处或之后,则应返回0。

因此,你应该回归零,因为根据定义,如果你已经完成了超出文件系统容量的lseek(),你肯定会超出文件的末尾(你无法创建文件)大于文件系统允许)。