C 我可以检查两个文件*或文件描述符编号是否指向同一个文件吗?

C 我可以检查两个文件*或文件描述符编号是否指向同一个文件吗?,c,C,我有一个程序,可以从文件中读取数据并写入文件。我希望防止用户为这两个文件指定相同的文件(出于明显的原因)。假设第一条路径在char*path1中,第二条路径在char*path2中。我可以在两条路径上调用fopen()文件号()并获得相同的号码吗 为了更清楚地解释: char* path1 = "/asdf" char* path2 = "/asdf" FILE* f1 = fopen(path1, "r"); FILE* f2 = fopen(path2, "w"); int fd1 =

我有一个程序,可以从文件中读取数据并写入文件。我希望防止用户为这两个文件指定相同的文件(出于明显的原因)。假设第一条路径在
char*path1
中,第二条路径在
char*path2
中。我可以在两条路径上调用
fopen()
文件号()并获得相同的号码吗

为了更清楚地解释:

char* path1 = "/asdf"
char* path2 = "/asdf"

FILE* f1 = fopen(path1, "r");
FILE* f2 = fopen(path2, "w");

int fd1 = fileno(f1);
int fd2 = fileno(f2);

if(fd1 == fd2) {
  printf("These are the same file, you really shouldn't do this\n");
}
编辑:
我不想比较文件名,因为使用像
/asdf//asdf
这样的路径或使用符号链接可以很容易地解决这个问题。最后,我不想将输出写入正在读取的文件(可能会导致严重问题)。

是-比较文件设备ID和inode。根据:

st_ino和st_dev字段一起唯一标识系统中的文件

使用

intsame_文件(intfd1,intfd2){
结构stat stat1、stat2;
if(fstat(fd1,&stat1)<0)返回-1;
if(fstat(fd2,&stat2)<0)返回-1;
return(stat1.st_dev==stat2.st_dev)和&(stat1.st_ino==stat2.st_ino);
}

No。在任何合理实现的POSIX系统上,对open的新调用将返回一个新的文件描述符。真的,为什么不只是比较文件名本身是否相等?一般来说,不是。什么是“同一个文件”?两个不同的文件名(路径)可以引用具有硬链接的磁盘上的相同数据块。相同的路径和文件也可以引用两个不同的数据块。怎么用?创建文件A,打开文件A,删除文件A,但不关闭它。现在创建一个相同的文件名,再打开一次——这是一个用相同名称打开的不同文件。两个打开描述符以相同的名称打开,指向不同的文件。为什么您不能只比较他/她提供的文件路径,如果它们相同,则会出错?刚刚尝试过,两个文件描述符即使在引用磁盘上的同一文件时也是不同的。仅供参考,您也可以通过使用来比较文件路径,以获取规范,已解析所有符号链接的绝对路径。如果您确实使用了
realpath
,请注意@clintp的警告:文件路径可能解析为相同的内容,但指向不同的文件。不要在有安全意识的代码中使用它。虽然它只是额外的几行,但它确实需要额外的头。你能想出更快的方法吗?
\include
有那么重要吗?更快?您希望它是快速的,还是正确的?输入时间比执行时间更快。应该澄清一下。打字时间从来都不是问题;开发时间(思考问题解决方案、查阅参考资料等)和调试时间(修复不充分解决方案中的错误、修复键入错误)是非常重要的。永远不要试图减少键入时间和增加开发或调试时间的风险;这样的努力是不值得的。
int same_file(int fd1, int fd2) {
    struct stat stat1, stat2;
    if(fstat(fd1, &stat1) < 0) return -1;
    if(fstat(fd2, &stat2) < 0) return -1;
    return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino);
}