您没有定义相同文件对您意味着什么。
在 Unix 或 Linux(或 Posix)上,在符合 Posix 的文件系统(如ext4或btrfs但不是FAT32)内,一个文件可以没有、一个或多个文件路径。所以文件路径指的是inode。然后,如果两个文件路径指向同一个 inode(在同一个文件系统中),则它们引用同一个底层文件。
您可以使用stat(2)系统调用来获取某个文件路径的设备(即文件系统)st_dev
和 inode 编号st_ino
。然后你应该比较它们。
或者,您可以想象相同的文件对您来说意味着具有相同内容的文件。这是一个定义不明确的定义:文件的内容可能会发生变化(因为它同时被写入 - 通过write(2),通过一些mmap(2) -ing,等等...... - 由其他一些进程)阅读它。所以严格意义上 比较文件内容(这是一项昂贵的操作)没有意义:在比较过程中,内容可以被其他进程更改。
如果您错误地忽略了文件内容可以更改的事实(因为在您读取文件的同时另一个进程正在写入文件),您可以读取两个文件并比较每个字节(同时考虑文件结尾)。像这样简单的东西:
FILE *f1 = fopen(path1, "r");
if (!f1) { perror(path1); exit(EXIT_FAILURE); };
FILE *f2 = fopen(path2, "r");
if (!f2) { perror(path2); exit(EXIT_FAILURE); };
bool samefile = true;
int c1, c2;
while (samefile && ((c1 = getc(f1)) != EOF) || (c2 = getc(f2)) != EOF))
if (c1 != c2) samefile = false;
fclose (f1), fclose (f2);
您可以通过首先比较f1
和f2
使用fseek(3)的大小和ftell(3)
你也可以使用普通open(2)
的andread(2)
和close(2)
系统调用,确保将块(例如4Kbytes)读入缓冲区(每个文件一个),并注意文件结束条件,并检查错误。
正如其他人指出的那样,您的程序明显是错误的,因为argv[0]
它是程序的命令名称。