10

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

int fstat(int fildes, struct stat *buf)

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

5 回答 5

23

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

为什么有两个功能呢?

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

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

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

于 2014-04-19T11:18:07.633 回答
4

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

也就是说,给定一个用andFILE *fp打开的,你可以像这样使用 : 。fopenstruct stat stfstatfstat(fileno(fp), &st);

于 2014-04-19T11:14:52.793 回答
1

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

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

于 2014-04-19T11:14:44.760 回答
0

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

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

稍微扩展一下,fstat如果您碰巧有一个文件描述符而不是文件路径,您将使用它。

关于函数提供的信息,它们在字面上是相同的,正如您从上面的引用中看到的那样。

于 2014-04-19T11:13:27.063 回答
0

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

于 2014-04-19T11:13:43.103 回答