0

手册页lseek()说:

lseek() 允许将文件偏移量设置为超出文件末尾(但这不会改变文件的大小)。如果稍后在此时写入数据,则后续读取间隙(“洞”)中的数据将返回空字节('\0'),直到数据实际写入间隙。

在错误部分它说:

EINVAL无效。或者:生成的文件偏移量将为负数,或超出可搜索设备的末尾。

我不确定如何解释lseek手册页,因为它没有提到 MTD。

假设MTD已经以读写权限打开,当MTD 寻求过去的EOFlseek()时,将如何响应?whenceSEEK_SET

4

1 回答 1

1

不要混合文件和设备概念。手册页非常清楚:您可以搜索文件的末尾,但不能超过文件可以承载的大小。

示例:您有一个 128Mb 设备,其中只有一个空文件。您可以打开文件并查找 < 128Mb 的任何位置,因为随后的 write() 会使文件增长。但是你肯定不能寻找 > 128Mb,因为随后的 write() 肯定会失败,而这在寻找时已经知道。

现在,到 MTD 设备。MTD 是将(闪存)硬件设备映射到文件的抽象层。鉴于此,文件暴露了文件和设备的行为,就像文件一样大,与它所指的设备完全一样,因此寻找文件末尾等于寻找设备末尾。在这种情况下,我想到了另一个好奇心:如果我们尝试截断该文件怎么办?我想我已经知道答案了...

于 2020-01-23T08:37:00.503 回答