【发布时间】:2021-09-05 12:28:03
【问题描述】:
当我的文件系统收到对write() 的调用,其缓冲区长度超出当前文件大小时,程序知道增加文件大小。
但是,如果文件变小了怎么办?例如,如果我将文件的内容从“hello”更改为“hell”怎么办?使用偏移量 0 缓冲区长度 4 发出对 write() 的调用。如果文件系统遵循这些指令并且仅更新存储数据的前 4 个字节而不更改文件大小,则下一次读取仍将显示相同的字符串。
我的 fuse 实现如何知道何时应该在它正在写入的当前缓冲区的末尾丢弃数据并缩小文件的大小?
那么,如何区分:
-
example string->write(offset=0, buf="hello")->hello -
example string->write(offset=0, buf="hello")->hellole string
我正在使用pyfuse3,但我怀疑这个逻辑在其他语言的绑定中是通用的。
【问题讨论】:
-
它不知道,而且它不应该丢弃数据。如果您有一个内容为“hello”的文件,并且您将“abcd”写入文件的开头,则新内容为“abcdo”。如果要截断文件,则需要调用
ftruncate或类似方法来明确告诉文件系统缩小文件。write调用不会缩小文件。 -
永远不会自动丢弃
write()末尾之外的数据;这需要显式截断操作。看起来 fuse 通过setattr()调用报告了这一点,指定update_size作为要修改的字段。 -
为什么你认为它永远正确的内容是
hello而不是hellole string? -
(
truncate调用的替代方法是带有一组标志的open(),其中包括O_TRUNC,但即便如此,它也不是write()进行截断)。 -
@Shawn,嗯? fuse 肯定支持
truncate():libfuse.github.io/doxygen/…