Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       LIST_ENTRY,   LIST_HEAD,   LIST_INIT,   LIST_INSERT_AFTER,  LIST_INSERT_HEAD,  LIST_REMOVE,  TAILQ_ENTRY,
       TAILQ_HEAD,   TAILQ_INIT,   TAILQ_INSERT_AFTER,   TAILQ_INSERT_HEAD,   TAILQ_INSERT_TAIL,   TAILQ_REMOVE,
       CIRCLEQ_ENTRY,      CIRCLEQ_HEAD,      CIRCLEQ_INIT,     CIRCLEQ_INSERT_AFTER,     CIRCLEQ_INSERT_BEFORE,
       CIRCLEQ_INSERT_HEAD, CIRCLEQ_INSERT_TAIL, CIRCLEQ_REMOVE - Implementations des listes, listes doubles  et
       circulaires

SYNOPSIS

       #include <sys/queue.h>

       LIST_ENTRY(TYPE);
       LIST_HEAD(HEADNAME, TYPE);
       LIST_INIT(LIST_HEAD *head);
       LIST_INSERT_AFTER(LIST_ENTRY *listelm,
                       TYPE *elm, LIST_ENTRY NAME);
       LIST_INSERT_HEAD(LIST_HEAD *head,
                       TYPE *elm, LIST_ENTRY NAME);
       LIST_REMOVE(TYPE *elm, LIST_ENTRY NAME);

       TAILQ_ENTRY(TYPE);
       TAILQ_HEAD(HEADNAME, TYPE);
       TAILQ_INIT(TAILQ_HEAD *head);
       TAILQ_INSERT_AFTER(TAILQ_HEAD *head, TYPE *listelm,
                       TYPE *elm, TAILQ_ENTRY NAME);
       TAILQ_INSERT_HEAD(TAILQ_HEAD *head,
                       TYPE *elm, TAILQ_ENTRY NAME);
       TAILQ_INSERT_TAIL(TAILQ_HEAD *head,
                       TYPE *elm, TAILQ_ENTRY NAME);
       TAILQ_REMOVE(TAILQ_HEAD *head, TYPE *elm, TAILQ_ENTRY NAME);

       CIRCLEQ_ENTRY(TYPE);
       CIRCLEQ_HEAD(HEADNAME, TYPE);
       CIRCLEQ_INIT(CIRCLEQ_HEAD *head);
       CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *head, TYPE *listelm,
                       TYPE *elm, CIRCLEQ_ENTRY NAME);
       CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *head, TYPE *listelm,
                       TYPE *elm, CIRCLEQ_ENTRY NAME);
       CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *head,
                       TYPE *elm, CIRCLEQ_ENTRY NAME);
       CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *head,
                       TYPE *elm, CIRCLEQ_ENTRY NAME);
       CIRCLEQ_REMOVE(CIRCLEQ_HEAD *head,
                       TYPE *elm, CIRCLEQ_ENTRY NAME);

DESCRIPTION

       Ces  macros  définissent  et  manipulent  trois  types de structures de données : les listes simples, les
       listes doubles et les listes circulaires. Ces trois structures supportent les fonctionnalités suivantes :

           *   Insertion d'un élément en tête de liste ;
           *   Insertion d'un élément après n'importe quel élément existant ;
           *   Suppression de n'importe quel élément ;
           *   Traversée séquentielle de la liste.

       Les listes sont les  plus  simples  de  ces  trois  structures  de  données  et  ne  supportent  que  les
       fonctionnalités ci-dessus.

       Les listes doubles ajoutent la fonctionnalité suivante :

           *   Un élément peut être ajouté en fin de liste.

       Cependant :

           1.  Toutes les insertions et suppressions doivent mentionner la tête de la liste ;
           2.  L'élément de tête nécessite deux pointeurs au lieu d'un seul ;
           3.  La  taille  du  code  est  environ 15% plus grande, et l'exécution environ 20% plus lente que les
               listes.

       Les listes circulaires ajoutent les fonctionnalités suivantes :

           *   Un élément peut être ajouté en fin de liste.
           *   Des entrées peuvent être ajoutées avant chaque entrée ;
           *   Elles peuvent être traversées à l'envers, de la queue à la tête ;

       Cependant :

           1.  Toutes les insertions et suppressions doivent mentionner la tête de la liste ;
           2.  L'élément de tête nécessite deux pointeurs au lieu d'un seul ;
           3.  La condition de terminaison pour la traversée est plus compliquée ;
           4.  La taille du code est environ 40% plus grande, et l'exécution environ  45%  plus  lente  que  les
               listes.

       Dans  les  définitions  de  macros,  TYPE  est le nom d'une structure définie par l'utilisateur, qui doit
       contenir un champ de type LIST_ENTRY, TAILQ_ENTRY ou CIRCLEQ_ENTRY, appelé NAME. L'argument HEADNAME  est
       le  nom  d'une  structure  définie  par  l'utilisateur  qui  doit  être  déclarée en utilisant les macros
       LIST_HEAD, TAILQ_HEAD ou  CIRCLEQ_HEAD.  Consultez  les  exemples  plus  bas  pour  une  explication  sur
       l'utilisation de ces macros.

   Listes
       Une  liste  débute par une structure définie par la macro LIST_HEAD. Cette structure contient un pointeur
       simple sur le premier élément de la liste. Les éléments sont doublement chaînés afin qu'un élément puisse
       être supprimé sans parcourir toute la liste. Des éléments peuvent être ajoutés après un élément  existant
       ou en tête de liste. Une structure LIST_HEAD est déclarée ainsi :

           LIST_HEAD(HEADNAME, TYPE) head;

       où  HEADNAME  est  le  nom  de la structure à définir, et TYPE le type d'élément à lier dans la liste. Un
       pointeur sur la tête de la liste peut ensuite être déclaré ainsi :

           struct HEADNAME *headp;

       (les noms head et headp sont choisis par l'utilisateur)

       La macro LIST_ENTRY déclare une structure qui connecte les éléments dans la liste.

       La macro LIST_INIT initialise la liste référencée par head.

       La macro LIST_INSERT_HEAD insère le nouvel élément elm à la tête de la liste.

       La macro LIST_INSERT_AFTER insère le nouvel élément elm après l'élément listelm.

       La macro LIST_REMOVE supprime l'élément elm de la liste.

   Exemple de liste
       LIST_HEAD(listhead, entry) head;
       struct listhead *headp;                 /* Tête de la liste */
       struct entry {
           ...
           LIST_ENTRY(entry) entries;          /* Liste */
           ...
       } *n1, *n2, *np;

       LIST_INIT(&head);                       /* Initialisation de liste */

       n1 = malloc(sizeof(struct entry));      /* Insertion en tête */
       LIST_INSERT_HEAD(&head, n1, entries);

       n2 = malloc(sizeof(struct entry));      /* Insertion après */
       LIST_INSERT_AFTER(n1, n2, entries);
                                               /* Parcours en avant */
       for (np = head.lh_first; np != NULL; np = np->entries.le_next)
           np-> ...

       while (head.lh_first != NULL)           /* Suppression */
           LIST_REMOVE(head.lh_first, entries);

   Listes doubles
       La tête d'une liste double est désignée  par  une  structure  définie  par  la  macro  TAILQ_HEAD.  Cette
       structure  contient  deux  pointeurs,  l'un sur le premier élément et l'autre sur le dernier élément. Les
       éléments sont doublement chaînés, ainsi un élément quelconque peut être supprimé sans  reparcourir  toute
       la  liste.  Les  nouveaux éléments peuvent être ajoutés après un élément existant, en tête ou en queue de
       liste. Une structure TAILQ_HEAD est déclarée ainsi :

           TAILQ_HEAD(HEADNAME, TYPE) head;

       où HEADNAME est le nom de la structure à définir, et TYPE représente le type des éléments à lier dans  la
       liste. Un pointeur sur la tête de la liste peut être déclaré ainsi :

           struct HEADNAME *headp;

       (les noms head et headp sont choisis par l'utilisateur)

       La macro TAILQ_ENTRY déclare une structure qui connecte les éléments dans la liste double.

       La macro TAILQ_INIT initialise la liste double référencée par head.

       La macro TAILQ_INSERT_HEAD insère le nouvel élément elm à la fin de la liste double.

       La macro TAILQ_INSERT_TAIL insère le nouvel élément elm à la fin de la liste double.

       La macro TAILQ_INSERT_AFTER insère le nouvel élément elm après l'élément listelm.

       La macro TAILQ_REMOVE supprime l'élément elm de la liste double.

   Exemple de liste double
       TAILQ_HEAD(tailhead, entry) head;
       struct tailhead *headp;                 /* Tête de liste double */
       struct entry {
           ...
           TAILQ_ENTRY(entry) entries;         /* Liste double */
           ...
       } *n1, *n2, *np;

       TAILQ_INIT(&head);                      /* Initialisation de liste */

       n1 = malloc(sizeof(struct entry));      /* Insertion au début */
       TAILQ_INSERT_HEAD(&head, n1, entries);

       n1 = malloc(sizeof(struct entry));      /* Insertion à la fin */
       TAILQ_INSERT_TAIL(&head, n1, entries);

       n2 = malloc(sizeof(struct entry));      /* Insertion après */
       TAILQ_INSERT_AFTER(&head, n1, n2, entries);
                                               /* Parcours en avant */
       for (np = head.tqh_first; np != NULL; np = np->entries.tqe_next)
           np-> ...
                                               /* Suppression */
       while (head.tqh_first != NULL)
           TAILQ_REMOVE(&head, head.tqh_first, entries);

   Listes circulaires
       La  tête  d'une  liste circulaire est désignée par une structure définie par la macro CIRCLEQ_HEAD. Cette
       structure contient une paire de pointeurs, l'un sur le premier élément de la liste circulaire et  l'autre
       sur  le  dernier  élément.  Les  éléments  sont  doublement chaînés, afin de pouvoir supprimer un élément
       quelconque sans reparcourir toute la liste. De nouveaux éléments peuvent être ajoutés avant ou  après  un
       élément existant, au début ou à la fin de la liste. Une structure CIRCLEQ_HEAD est déclarée ainsi :

           CIRCLEQ_HEAD(HEADNAME, TYPE) head;

       où  HEADNAME  est le nom de la structure à définir, et TYPE est le type de l'élément à lier dans la liste
       circulaire. Un pointeur sur la tête de la liste circulaire peut être déclaré ainsi :

           struct HEADNAME *headp;

       (les noms head et headp sont choisis par l'utilisateur)

       La macro CIRCLEQ_ENTRY déclare une structure qui connecte les éléments dans la liste circulaire.

       La macro CIRCLEQ_INIT initialise la liste circulaire référencée par head.

       La macro CIRCLEQ_INSERT_HEAD insère le nouvel élément elm au début de la liste circulaire.

       La macro CIRCLEQ_INSERT_TAIL insère le nouvel élément elm à la fin de la liste circulaire.

       La macro CIRCLEQ_INSERT_AFTER insère le nouvel élément elm après l'élément listelm.

       La macro CIRCLEQ_INSERT_BEFORE insère le nouvel élément elm avant l'élément listelm.

       La macro CIRCLEQ_REMOVE supprime l'élément elm de la liste circulaire.

   Exemple de liste circulaire
       CIRCLEQ_HEAD(circleq, entry) head;
       struct circleq *headp;              /* Tête de liste circulaire */
       struct entry {
           ...
           CIRCLEQ_ENTRY(entry) entries;   /* Liste circulaire */
           ...
       } *n1, *n2, *np;

       CIRCLEQ_INIT(&head);                /* Initialisation */

       n1 = malloc(sizeof(struct entry));  /* Insertion au début */
       CIRCLEQ_INSERT_HEAD(&head, n1, entries);

       n1 = malloc(sizeof(struct entry));  /* Insertion à la fin */
       CIRCLEQ_INSERT_TAIL(&head, n1, entries);

       n2 = malloc(sizeof(struct entry));  /* Insertion après */
       CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries);

       n2 = malloc(sizeof(struct entry));  /* Insertion avant */
       CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries);
                                           /* Parcours en avant */
       for (np = head.cqh_first; np != (void *)&head;
               np = np->entries.cqe_next)
           np-> ...
                                           /* Parcours en arrière */
       for (np = head.cqh_last; np != (void *)&head; np = np->entries.cqe_prev)
           np-> ...
                                           /* Suppression */
       while (head.cqh_first != (void *)&head)
           CIRCLEQ_REMOVE(&head, head.cqh_first, entries);

CONFORMITÉ

       Pas dans POSIX.1-2001. Présentes sur les BSD. Les fonctions de liste queue sont apparues dans BSD 4.4.

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions    pour    signaler    des    anomalies    peuvent     être     trouvées     à     l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe       Blaess       <http://www.blaess.fr/christophe/>      (1996-2003),      Alain      Portal
       <http://manpagesfr.free.fr/> (2003-2006). Nicolas François  et  l'équipe  francophone  de  traduction  de
       Debian (2006-2009).

       Veuillez  signaler  toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».

Linux                                           28 décembre 2007                                        QUEUE(3)