-3

2 つのファイルが同一かどうかを確認する必要があるため、struct stat を使用しました

    fdin = open(argv[0],O_RDONLY);
    statos= fstat(fdin, &stat);
    close(fdin);
    fdin = open(argv[1],O_RDONLY);
    statos1= fstat(fdin, &stat1);
    close(fdin);
    printf("file 1 is in size: %lu\n",stat1.st_ino);
    printf("file 2 is in size: %lu\n",stat.st_ino);

結果

file 1 is in size: 9569486
file 2 is in size: 9569479

同じパスを持つ同じファイルに対して st.ino が同一でないのはなぜですか?? 2つの異なるファイルが同一である場合、システムコールで確認できます

4

3 に答える 3

3

これは、2 つの異なるファイルを開いているためです。

./a.out ab.txt ab.txt

argv[0]は実行可能ファイルで、argv[1]「ab.txt」です。

コードにエラー チェックを入れれば、それは明らかです。

何らかの理由で、inode を「サイズ」として出力しています。

于 2013-03-30T10:08:10.210 に答える
1

st_inoファイルの inode 番号のフィールドです。inode 番号は、各ファイルの構造の一意の識別子です。inode 構造体は、ファイルに関して stat 呼び出しが返す情報を保持します。

希望するフィールドは ですst_size

于 2013-03-30T10:03:01.380 に答える
0

同一ファイルが何を意味するかを定義していません。

Unix または Linux (または Posix) では、Posix 準拠のファイル システム ( ext4btrfsなどで、 FAT32は除く) 内では、ファイルは 1 つまたは複数のファイル パスを持つことができます。したがって、ファイル パスはinodeを参照します。次に、2 つのファイル パスが (同じファイル システム内の) 同じ inode を指している場合、それらのファイル パスは同じ基になるファイルを参照します。

stat(2)システムコールを使用して、デバイス (つまりファイルシステム)とファイルパスのst_devinode 番号を取得できます。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ますf2ftell(3)

単純なopen(2)andread(2)およびclose(2)syscall を使用することもできます。必ずチャンク (たとえば 4K バイト) をバッファー (ファイルごとに 1 つ) に読み込み、ファイルの終わりの状態を処理し、エラーをチェックしてください。

他の人が指摘したように、特にargv[0]プログラムのコマンド名が間違っているため、プログラムは間違っています。

于 2013-03-30T10:50:57.770 に答える