【问题标题】:What are the advantages of using fstat() vs stat()?使用 fstat() 与 stat() 的优势是什么?
【发布时间】:2014-06-03 20:32:17
【问题描述】:

如果我有一个具有已知文件描述符的打开文件,使用fstat()stat() 相比有什么优势?为什么不只有一个功能?

int fstat(int fildes, struct stat *buf)

int stat(const char *path, struct stat *buf)

【问题讨论】:

  • 如果进程与文件描述符相关我们可以使用fstat(),如果名称可用则可以使用stat()。
  • 根据它可能使用的工作进程,例如你已经用文件描述符打开了文件,当时使用 fstat() 。但是如果文件没有打开,那么你可以使用 stat() 。那就是不同的。

标签: c file system-calls stat fstat


【解决方案1】:

如前所述,stat() 适用于文件名,而 fstat() 适用于文件描述符。

为什么要有两个函数呢?

一个因素可能是方便。能够fstat() 从代码的其他部分获得的文件描述符真是太好了,而不必传递文件名。

不过,主要原因是安全性。如果您先stat() 文件然后open() 文件,则在文件可能被修改(或更改其权限等)或替换为符号链接之间有一小段时间。

fstat() 避免了这个问题。你先open()文件,然后文件就不能再在你脚下换掉了。然后你fstat(),你可以确定你有正确的文件。

【讨论】:

    【解决方案2】:

    fstat 将与通过open 调用获得的文件描述符一起使用。

    也就是说,假设FILE *fpfopenstruct stat st 打开,您可以像这样使用fstatfstat(fileno(fp), &st);

    【讨论】:

      【解决方案3】:

      如果您有文件描述符,则不一定知道路径(例如,当文件被应用程序的其他部分打开时)。

      如果你知道路径,就不需要为了调用fstat而调用open来获取文件描述符。

      【讨论】:

        【解决方案4】:

        如果您查看man fstat,您将看到以下内容:

        fstat() 与 stat() 相同,只是要统计的文件是 由文件描述符 fd 指定。

        稍微扩展一点,如果你碰巧有一个文件描述符而不是文件路径,你可以使用fstat

        关于函数提供的信息,从上面的引用中可以看出,它们实际上是相同的。

        【讨论】:

        • 所以如果我知道路径,但我也知道文件描述符,我应该选择哪一个?
        • 选择你喜欢的。如果您担心性能,请对两者进行基准测试,看看哪个运行得更快。 :)
        【解决方案5】:

        如果你只有一个文件描述符(但你可能不知道它的路径),那么你可以使用fstat();如果你只有一个文件的路径,那么你可以直接使用stat(),不需要先打开它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-25
          • 2011-02-07
          • 1970-01-01
          • 2020-09-25
          • 2016-07-03
          • 2011-07-19
          • 1970-01-01
          • 2014-08-03
          相关资源
          最近更新 更多