IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

[REPERTOIRE] Que fait la fonction readdir_r ?


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut [REPERTOIRE] Que fait la fonction readdir_r ?
    Bonjour à tous.

    J'ai réussi à faire une fonction qui enregistre le contenu d'un répertoire dans un tableau. Cette fonction utilise readdir() . J'aimerait à la place utiliser readdir_r() . Sauf qu'en lisant les pages de man sur le net, je n'arrive pas à comprendre ce qu'elle fait exactement.

    Voici son prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int readdir_r(DIR *dir, struct dirent *entry, struct dirent **result);
    Pour sa valeur de retour, c'est facile, c'est zéro en cas de succès, et différent de zéro en cas d'échec.

    1) Pour le premier argument (dir), je me demande si il est modifié. Est ce que c'est la structure de type DIR qui contient la position courante ? (et donc est-ce que c'est dir qui est incrémenté à chaque appel ?)

    2) Pour le deuxième argument (entry), est ce que la fonction créé une structure de type "dirent" avec un malloc, remplit ses champs avec les valeurs de l'entrée courante du répertoire, et enfin fait pointer entry sur cette structure ?

    3) Pour le troisième argument (result) , il pointe vers entry.


    D'abord est-ce que ce que je dit est bon ? Ensuite , je ne voit pas à quoi sert result. Surement que la fonction en a besoin (mais pour quel usage ?) et qu'il ne sert à rien pour nous (on se fiche de savoir ce qu'il vaut, à part pour détecter la fin du répertoire).

    Merci pour votre temps.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Dans la documentation de kernel.org, dans les notes, ils indiquent qu'il faut allouer nous-même la place de l'argument "entry" :

    (traduction par moi) Comme POSIX.1 ne spécifie pas la taille du champs d_name, et comme d'autres champs non-standards peuvent précéder ce champs dans la structure, les applications portables qui utilisent readdir_r() devraient allouer le buffer dont l'adresse est passée en argument comme suit :

    len = offsetof(struct dirent, d_name) + pathconf(dirpath, _PC_NAME_MAX) + 1;
    entryp = malloc(len);
    Cependant je ne comprend pas pourquoi on a besoin de faire un malloc alors qu'il suffit de déclarer une struct dirent de manière classique et de passer son adresse en deuxième argument ...

    Sur la même page, il y a la définition de struct dirent :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
               struct dirent {
                   ino_t          d_ino;       /* inode number */
                   off_t          d_off;       /* offset to the next dirent */
                   unsigned short d_reclen;    /* length of this record */
                   unsigned char  d_type;      /* type of file; not supported
                                                  by all file system types */
                   char           d_name[256]; /* filename */
               };

    Le champs "d_name" aurait été juste un pointeur de caractère, j'aurait compris qu'on fasse un malloc, mais là il a déjà de la mémoire allouée ...

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème, c'est apparemment que le champ d_name n'est pas garanti avoir une taille supérieure à la taille maximale d'un nom de fichier.

    Ce qui réclame d'utiliser pathconf() pour obtenir cette taille maximale, et d'allouer soi-même ce buffer (comme pour une structure à longueur variable)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci ! je vient de comprendre le principe d'allocation dynamique de mémoire pour une structure, j'avait jamais pensé qu'on pouvait allouer tous les champs d'un coup, avec les trous d'alignement qu'il peut y avoir et tout ...

    Quelqu'un a une idée sur l'utilité du troisième argument ?

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui ;-)

    le _r de readdir_r veut dire réentrant

    Pour que ce soit réentrant, il faut bien que tu aies là où tu en étais au dernier appel...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ok ... la structure dirent contient un champs qui indique la position de la prochaine entrée du répertoire, et le troisième argument permet d'y accéder à l'appel suivant de la fonction.

    En fait, ce qui était dur à comprendre c'est que le troisième argument est utile en entrée et en sortie de la fonction ...

    Merci souviron du languedoc !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. que fait cette fonction ?
    Par nitteo dans le forum C#
    Réponses: 21
    Dernier message: 31/01/2008, 17h30
  2. Que fait cette fonction ?
    Par masterix59 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/11/2007, 21h13
  3. Que fait la fonction htmlentities ?
    Par Ravaka dans le forum Langage
    Réponses: 16
    Dernier message: 10/04/2007, 17h56
  4. que fait cette fonction ?
    Par salseropom dans le forum C
    Réponses: 21
    Dernier message: 12/10/2006, 18h33
  5. [Conception] Que fait ma fonction ?
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/04/2006, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo