Déterminer si deux chemins de fichiers pointent vers le même fichier sous Linux / C?

Sous Linux, j’ai deux chemins de fichier A et B:

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

Je veux maintenant déterminer, dois-je open(2) les deux …

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

… vais-je avoir deux descripteurs de fichiers ouverts sur le même fichier dans le système de fichiers?

Pour déterminer cela, j’ai pensé à stat(2) :

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

Quelque chose comme (pseudo-code):

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

Y at-il des cas où A et B sont le même fichier mais IsSameFile renverrait false?

Y a-t-il des cas où A et B sont des fichiers différents mais IsSameFile renverrait true?

Y a-t-il une meilleure façon de faire ce que j’essaie de faire?

Votre programme fonctionnera A.st_ino dans tous les cas, car A.st_ino renverra le numéro d’inode des fichiers de votre système. Puisque le numéro d’inode est unique, votre programme identifiera correctement si les deux fichiers ouverts sont identiques ou non.

Vous pouvez également vérifier la valeur de A.st_mode pour savoir si le fichier est un lien symbolique .

Cela dépend de la raison pour laquelle vous voulez éviter d’ouvrir le même fichier deux fois. Votre solution est généralement la bonne, mais il existe des situations où les fichiers doivent être considérés comme identiques s’ils ont le même chemin absolu, mais pas s’ils sont liés au même inode. Dans ce cas, vous devez convertir les chemins en chemins absolus et les comparer … voir Obtenir le chemin absolu d’un fichier

Vous devez également décider si vous considérez un lien symbolique vers un fichier équivalent au fichier ou un autre lien symbolique vers ce fichier. Pour l’équivalence d’inode, cela détermine s’il faut utiliser stat ou lstat . Pour l’équivalence de chemin, il détermine si vous pouvez utiliser realpath ou si vous devez obtenir le chemin absolu sans suivre les liens symboliques.