【问题标题】:UNIX lseek/read/write behaviorUNIX lseek/读/写行为
【发布时间】:2013-01-15 00:18:50
【问题描述】:

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

【问题讨论】:

标签: linux unix file-io seek


【解决方案1】:

POSIX specs for lseek() 状态允许您设置超出文件末尾的位置:

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

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


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


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多