同一ファイルが何を意味するかを定義していません。
Unix または Linux (または Posix) では、Posix 準拠のファイル システム ( ext4やbtrfsなどで、 FAT32は除く) 内では、ファイルは 1 つまたは複数のファイル パスを持つことができます。したがって、ファイル パスはinodeを参照します。次に、2 つのファイル パスが (同じファイル システム内の) 同じ 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);
最初にfseek(3)のサイズを比較して使用することにより、上記のコードを最適化できf1
ますf2
。ftell(3)
単純なopen(2)
andread(2)
およびclose(2)
syscall を使用することもできます。必ずチャンク (たとえば 4K バイト) をバッファー (ファイルごとに 1 つ) に読み込み、ファイルの終わりの状態を処理し、エラーをチェックしてください。
他の人が指摘したように、特にargv[0]
プログラムのコマンド名が間違っているため、プログラムは間違っています。