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

zi8p0yeb  于 2023-05-28  发布在  其他
关注(0)|答案(2)|浏览(121)

我有一个程序,可以从文件中读取并写入文件。我想防止用户为这两个文件指定相同的文件(原因显而易见)。假设第一条路径在char* path1中,第二条路径在char* path2中。我可以fopen()两个路径,调用fileno()上的每一个,并获得相同的数字?
为了更清楚地解释:

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之类的路径或使用符号链接很容易就能解决这个问题。最后,我不想把输出写到我正在阅读的文件中(可能会导致严重的问题)。

vcudknz3

vcudknz31#

是-比较文件设备ID和信息节点。根据<sys/stat.h> specification
st_ino和st_dev字段一起唯一标识系统中的文件。
使用

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);
}
wnavrhmk

wnavrhmk2#

您还可以使用kcmp syscall来跨进程(但也可以在进程内部)比较文件描述符。

相关问题