【问题标题】:How do I know when to shrink the size of a file after a write call?我怎么知道在写调用后何时缩小文件的大小?
【发布时间】:2021-09-05 12:28:03
【问题描述】:

当我的文件系统收到对write() 的调用,其缓冲区长度超出当前文件大小时,程序知道增加文件大小。

但是,如果文件变小了怎么办?例如,如果我将文件的内容从“hello”更改为“hell”怎么办?使用偏移量 0 缓冲区长度 4 发出对 write() 的调用。如果文件系统遵循这些指令并且仅更新存储数据的前 4 个字节而不更改文件大小,则下一次读取仍将显示相同的字符串。

我的 fuse 实现如何知道何时应该在它正在写入的当前缓冲区的末尾丢弃数据并缩小文件的大小?

那么,如何区分:

  1. example string -> write(offset=0, buf="hello") -> hello
  2. 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/…

标签: python linux fuse


【解决方案1】:

我的问题是我在打开文件时没有检查O_TRUNC 标志,结果发现truncate 命令使用setattr,而shell 中的重定向使用openO_TRUNC 设置。

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2022-12-06
    • 2017-05-17
    • 2014-10-29
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多