在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的情况?
有没有更好的方法来做我想做的事情?
答案 0 :(得分:4)
您的程序在所有情况下都能正常运行,因为A.st_ino
会返回系统中文件的 inode数。由于inode编号是唯一的,因此您的程序将正确识别打开的两个文件是否相同。
您还可以检查A.st_mode
的值,以确定该文件是否为符号链接。
答案 1 :(得分:0)
这取决于你为什么要避免两次打开同一个文件。您的解决方案通常是正确的解决方案,但在某些情况下,如果文件具有相同的绝对路径,则应视为相同,但如果它们是指向同一inode的链接则不应视为相同。在这种情况下,您需要将路径转换为绝对路径并进行比较...请参阅Getting absolute path of a file
您还需要决定是否考虑使用与文件等效的文件或其他符号链接的符号链接。对于inode等效,它决定是使用stat
还是lstat
。对于路径等价,它确定您是否可以使用realpath
或者是否需要在不遵循符号链接的情况下获取绝对路径。