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