8

Linux では、A と B の 2 つのファイル パスがあります。

const char* A = ...;
const char* B = ...;

私は今、open(2)両方を決定したいのですが...

int fda = open(A, ...);
int fdb = open(B, ...);

...ファイルシステム内の同じファイルに対して 2 つのファイルハンドルを開くことはできますか?

これを判断するために、私は次のことを考えましたstat(2)

struct stat
{
    dev_t st_dev;
    ino_t st_ino;
    ...
}

(疑似コード) のようなもの:

bool IsSameFile(const char* sA, const char* sB)
{
    stat A = stat(sA);
    stat B = stat(sB);

    return A.st_dev == B.st_dev && A.st_ino == B.st_ino;
}

A と B は同じファイルですが、IsSameFilefalse を返す場合はありますか?

A と B が異なるファイルであるがIsSameFiletrue を返す場合はありますか?

私がやろうとしていることを行うためのより良い方法はありますか?

4

2 に答える 2

4

システム内のファイルのinode 番号A.st_inoを返すため、プログラムはすべての場合で正常に動作します。inode 番号は一意であるため、プログラムは開かれた 2 つのファイルが同じかどうかを正しく識別します。

の値をチェックしてA.st_mode、ファイルがシンボリック リンクかどうかを確認することもできます。

于 2013-03-27T01:49:00.807 に答える
0

同じファイルを 2 回開かないようにしたい理由によって異なります。あなたの解決策は通常正しいものですが、ファイルが同じ絶対パスを持っている場合は同じと見なされるべきであるが、同じ i ノードへのリンクである場合はそうではない場合があります。その場合、パスを絶対パスに変換して比較する必要があります...ファイルの絶対パスの取得を参照してください

また、ファイルと同等のファイルへのシンボリック リンクを考慮するか、別のシンボリック リンクを考慮するかを決定する必要があります。i ノードの同等性については、 または を使用するかどうかを決定しstatますlstat。パスの等価性についてはrealpath、シンボリックリンクをたどらずに絶対パスを使用できるか、または絶対パスを取得する必要があるかを決定します。

于 2013-03-27T02:03:19.037 に答える