1

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

4

1 回答 1

4

允许您将位置设置在文件末尾之外的状态的POSIX 规范:lseek()

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

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


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


POSIXread()规范对发生的事情非常坚定:

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

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

于 2013-01-15T00:36:14.247 回答