8

在 Linux 下,我有两个文件路径 A 和 B:

const char* A = ...;
const char* B = ...;

我现在想确定,我应该open(2)他们俩...

int fda = open(A, ...);
int fdb = open(B, ...);

...我会在文件系统中打开同一个文件的两个文件句柄吗?

为了确定这一点,我想到了stat(2)

struct stat
{
    dev_t st_dev;
    ino_t st_ino;
    ...
}

类似(伪代码):

bool IsSameFile(const char* sA, const char* sB)
{
    stat A = stat(sA);
    stat B = stat(sB);

    return A.st_dev == B.st_dev && A.st_ino == B.st_ino;
}

是否存在 A 和 B 是同一个文件但IsSameFile返回 false 的情况?

是否存在 A 和 B 是不同文件但IsSameFile会返回 true 的情况?

有没有更好的方法来做我想做的事情?

4

2 回答 2

4

您的程序在所有情况下都可以正常工作,因为A.st_ino将返回系统中文件的inode 编号。由于 inode 编号是唯一的,您的程序将正确识别打开的两个文件是否相同。

您还可以检查 的值A.st_mode以确定文件是否为符号链接

于 2013-03-27T01:49:00.807 回答
0

这取决于您为什么要避免两次打开同一个文件。您的解决方案通常是正确的,但在某些情况下,如果文件具有相同的绝对路径,则应将其视为相同,但如果它们是指向同一 inode 的链接,则不应视为相同。在这种情况下,您需要将路径转换为绝对路径并进行比较...请参阅获取文件的绝对路径

您还需要决定是否考虑将符号链接指向与该文件等效的文件或另一个符号链接。对于 inode 等效性,它决定是否使用statlstat。对于路径等价,它决定了您是否可以使用realpath或者是否需要在不遵循符号链接的情况下获取绝对路径。

于 2013-03-27T02:03:19.037 回答