bonjour tout le monde
comment ecrire un programme c sous unix qui prend en parametre 2 fichiers et qui teste si le premier fichier est un lien physique vers le deuxieme ?
merci
Version imprimable
bonjour tout le monde
comment ecrire un programme c sous unix qui prend en parametre 2 fichiers et qui teste si le premier fichier est un lien physique vers le deuxieme ?
merci
Bonjour,
Sauf si je n'ai rien compris aux liens physiques, "A est un lien physique vers B" a ni plus ni moins de sens que "B est un lien physique vers A".
Je vous propose:Dans la fonction, dernière ligne (return -1;), en remplaçant -1 par 0, vous aurez une interface peut-être plus utilisable.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> static int isHardLink(const char* path1, const char* path2){ struct stat attribs; ino_t inode; if(stat(path1, &attribs) == 0){ inode = attribs.st_ino; if(stat(path2, &attribs) == 0){ return inode == attribs.st_ino; } } return -1; } int main(void) { const char* fichier = "/home/pierre/test";//un fichier texte const char* lien = "/home/pierre/testln";//résultat de "ln test testln" const char* paslien = "/home/pierre/testpaslien";//un fichier texte quelconque const char* bidon = "/home/pierre/testbidon";//aucun fichier de ce nom printf("%s, %s: %d\n", fichier, lien, isHardLink(fichier, lien)); printf("%s, %s: %d\n", fichier, paslien, isHardLink(fichier, paslien)); printf("%s, %s: %d\n", fichier, bidon, isHardLink(fichier, bidon)); return EXIT_SUCCESS; }
merci infiniment :)
Comparer les numéros d'inode ne suffit pas ; il faut aussi comparer les numéros de device. Ont peut avoir deux fichiers sur deux devices différents, avec le même numéro d'inode.
qu'est ce qu'un device ?
Un périphérique.
matafan a raison, chaque file system possède une table des inodes et un inode est un lien vers un fichier (je le fais simple).
Si tu as 2 file system (sur 2 disques durs logiques différents, qu'ils soient sur un seul disque dur physique ou bien 2 différents), tu as 2 tables d'inodes et donc deux fois le même numéro d'inode (qui vont pointer sur 2 fichiers différents puisqu'ils sont sur 2 file system différents).
Le numéro d'inode n'est pas suffisemment discriminant et il faut rajouter le numéro de device qui est aussi donné dans la structure stat.
Effectivement, j'étais allé un peu vite.ouCode:
1
2
3
4
5
6
7 static int isHardLink(const char* path1, const char* path2) { struct stat attribs1, attribs2; if (!stat(path1, &attribs1) && !stat(path2, &attribs2)){ return attribs1.st_ino == attribs2.st_ino && attribs1.st_dev == attribs2.st_dev; } return -1; }
Le comportement des deux versions n'est pas le même dans le cas où un des fichiers n'est pas accessible.Code:
1
2
3
4 static int isHardLink(const char* path1, const char* path2) { struct stat attribs1, attribs2; return !stat(path1, &attribs1) && !stat(path2, &attribs2) && attribs1.st_ino == attribs2.st_ino && attribs1.st_dev == attribs2.st_dev; }