确定两个文件路径是否指向Linux/C下的同一文件?

And*_*zos 6 c linux filesystems stat

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

const char* A = ...;
const char* B = ...;
Run Code Online (Sandbox Code Playgroud)

我现在想确定,我应该open(2)两个......

int fda = open(A, ...);
int fdb = open(B, ...);
Run Code Online (Sandbox Code Playgroud)

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

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

struct stat
{
    dev_t st_dev;
    ino_t st_ino;
    ...
}
Run Code Online (Sandbox Code Playgroud)

像(伪代码)的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

有没有A和B是同一个文件但IsSameFile会返回false的情况?

是否有任何情况下A和B是不同的文件但IsSameFile会返回true?

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

Dee*_*epu 4

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

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

  • 如果名称实际上是损坏的符号链接,则只能通过“stat()”发现名称是(损坏的)符号链接。如果没有损坏,“stat()”会在链接末尾报告文件或设备;如果名称是符号链接,则“lstat()”报告(第一个)符号链接。 (3认同)