Ouvir un fichier à partir d'un inode

Signaler
Messages postés
81
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
26 septembre 2006
-
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
-
Bonsoir,
Je travaille actuellement sur un système QNX (type UNIX et POSIX)
Si j'ai bien compris, les fichiers d'un dossiers sont gérés par une liste chainée. En effet, lorsque je fais un
char[100] sFicher ;
for(i=0;i<10000;i++)
{
    sprintf(sFichier,"%d.txt", i)   
    FILE* fichier=fopen(sFichier);
    fclose(fichier);
}

l'opération est de plus en plus longue.

j ai découvert une librairie, <dirent.h>, avec laquelle je peux parcourir, succecivement, tous les fichiers d'un dossier. Je récupère alors l'Inode du fichier.
Est il possible, à partir de ce Inode, d'ouvrir le fichier dans repasser par le nom et la fonction fopen  ?

Merci d'avance pour votre réponses.

    Nico
Strasbourg
France

4 réponses

Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
13
un inode ou index node est une structure de données contenant les propriétés d'une entrée dans le système de fichier.
A un fichier ou référence (path) correspond un et un seul inode.
Par contre à un inode correspond 1 à n références (regardes la fonction ln).
Par conséquent, si on utilisait les inodes avec les primitives de manipulation de fichier (fopen...), le système ne saurait pas quelle référence (fichier) utiliser.
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
13
Pardon de 0 à n et non de 1 à n, un inode peut exister sans qu'il corresponde à une reférence dans le système de fichier.
Messages postés
81
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
26 septembre 2006

Merci pour cette réponse....

Si j'ai bien compris, on a 1 inode pour 1 fichier (fichier = données palcées physiquement sur le disque).

Le fonction "opendir" de la librairie <dirent.h>, me retourne une structure "dossier" à partir de laquelle, je peux appeler la fonction "readdir". Celle ci, appelée en boucle, va avancer dans le dossier, en me donnant une structure sur un fichier. Cette structure "dirent" comprorte entre autre, comme champs, le nom du fichier et son inode.

Si de là, je fais appel à la fonction fopen, le système va refaire la correspondance entre le nom du ficher, et son inode, pour retouver l'emplacement physique.
N'est-il donc pas possible, d'ouvrir un fichier directement avec l'inode, pour éviter cette manipulation ?

Si mon explication est fausse, n'hésitez pas à me le signaler; et si vous avez des liens expliquant les système sde fichiers.

Merci

    Nico
Strasbourg
France
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
13
Nope,

A une inode peut correspondre 0 à n référence (chemin menant à un fichier). La même inode peut être référencée par plusieurs chemins dans le système de fichier.
Exemple, soit le fichier :
/home/machin/toto.txt
on tape la commande suivante :
ln toto.txt toto2.txt
Si on fait un ls -al, on se retrouve avec deux fichiers aux caractéristiques et au contenu identiques. Et si on modifie toto2.txt, on modifie toto.txt. Car les deux références correspondent à la même inode.
Par contre à toto.txt ne correspond qu'une et une seule inode, et à toto2.txt correspond une et une seule inode. Et en fait c'est la même inode pour les deux.
La propriété des inodes fait que les deux références sont totalement équivalentes mais "indépendantes" (d'un point de vue référence, pas concernant les blocs de données) :
rm toto.txt
Il ne reste plus que toto2.txt.
On n'a pas supprimé l'entrée d'inode car il reste encore une référence sur elle (toto2.txt)

Le fonction "opendir" de la librairie <dirent.h>, me retourne une structure "dossier" à partir de laquelle, je peux appeler la fonction "readdir". Celle ci, appelée en boucle, va avancer dans le dossier, en me donnant une structure sur un fichier. Cette structure "dirent" comprorte entre autre, comme champs, le nom du fichier et son inode.

Oui

Si de là, je fais appel à la fonction fopen, le système va refaire la correspondance entre le nom du ficher, et son inode, pour retouver l'emplacement physique.

Oui

N'est-il donc pas possible, d'ouvrir un fichier directement avec l'inode, pour éviter cette manipulation ?

Toujours pas puisque qu'à une inode peut correspondre plusieurs références.
Ainsi avec l'exemple precédent, si fopen acceptait comme paramètre l'inode, quel fichier faudrait-il ouvrir ? toto.txt ou toto2.txt ? Tandis que fopen(toto.txt), le système sait de quel fichier il s'agit (il a sa vrai référence d'un point de vue utilisateur).

Consultes le fichier d'entête sys/types.h ou sys/stat.h pour la structure d'une inode.
Consultes le fichier d'entete dirent.h pour plus d'infos sur la structure dirent.
Rien ne vaut un petit détour dans les sources du noyau pour comprendre.