【问题标题】:File size of virtual file虚拟文件的文件大小
【发布时间】:2015-11-03 14:26:35
【问题描述】:

我正在使用 FUSE 创建一个覆盖文件系统,其中目录增加了虚拟实体。我将这些实体的文件大小设置为 0,因为在阅读它们之前,我无法知道它们应该是什么,这在我的情况下特别昂贵。

但是,似乎进行了明显的优化,因为零长度文件不会引起任何read 调用(仅openrelease)。

因此,我的问题很简单,我应该将文件大小设置为多少?我知道符号链接的文件名长度的大小;考虑到它不是符号链接,这会起作用吗?否则,我能做的最好的就是为大小提供一个下限......如果read 只有一个文件描述符、块大小和偏移量,大概它会读取 'til EOF 而不是stat 可以告诉它的任何内容。

【问题讨论】:

    标签: c filesystems fuse stat


    【解决方案1】:

    文件大小必须正确。很多代码都依赖于这些信息,你不能简单地省略它。

    这意味着您需要找出一种有效的方法来缓存/预先计算这些信息。

    查看cmdfs 的源代码,它对文件系统中的所有文件运行命令。 Linux Magazine has an overview article.

    【讨论】:

    • 这个依赖代码在什么级别?在系统调用级别,看起来(尽管我可能错了!)好像这并不重要;在应用程序级别,我知道读取此类文件的唯一软件不依赖于文件大小...如果更好,我可以根据下限提供估计。
    • 操作系统使用此值来确定何时发送 EOF。所以实际上每个从文件中读取数据的人都需要它。
    • 自己不能发出这个信号吗?
    • @Xophmeister 根据什么自己发送 EOF?实际文件的大小?仅仅因为您看到的应用程序代码不使用文件大小并不意味着应用程序进行的库或系统调用可以在没有适当文件大小的情况下工作。
    • 我添加了一些应该有帮助的链接。
    【解决方案2】:

    如果事先不知道文件大小,请使用选项-odirect_io 挂载并设置st_size = 0。我希望这会有所帮助。

    在 fuse 手册页中:

      direct_io
             This option disables the use of page cache (file content cache) in the kernel for this filesystem. This has several affects:
    
      1.     Each read(2) or write(2) system call will initiate one or more read or write operations, data will not be cached in the kernel.
    
      2.     The  return  value of the read() and write() system calls will correspond to the return values of the read and write operations.
             This is useful for example if the file size is not known in advance (before reading it).
    

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 2011-08-24
      • 2013-11-28
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2010-10-03
      • 2017-10-16
      相关资源
      最近更新 更多