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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Effectivement, j'étais allé un peu vite.ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Partager