¿Cómo usar la lista de sys/queue.h?

2 minutos de lectura

Actualmente, he implementado una lista de enlaces únicos, así:

struct PeerNode {
     struct Peer* cargo;
     struct PeerNode* next;
};

…y tengo una estructura que contiene un par de estas listas enlazadas, así:

struct Torrent {
     ...
     struct PeerNode* peer_list;
     struct PeerNode* unchoked_peers;
     ...
}

Me gustaría reemplazar esto usando las macros proporcionadas por sys/queue.h. Deduzco que podría reemplazar mi código con algo como esto:

struct Torrent {
     ...
     LIST_ENTRY(PeerNode, Peer) peer_list;
     struct PeerNode* unchoked_peers;
     ...
}

Entonces, de mirar man queuecreo que inicializaría las listas haciendo algo como esto:

LIST_INIT(&peer_list);
LIST_INIT(unchoked_peers);

Sin embargo, no entiendo cómo LIST_ENTRY factores en el uso de la lista. Desde el man página, dice: “La macro LIST_ENTRY declara una estructura que conecta los elementos de la lista”, pero realmente no entiendo lo que esto significa.

¿Por qué querría declarar una estructura para conectar los elementos de la lista? ¿No debería cada nodo estar conectado al siguiente nodo a través de un puntero, como mi implementación de lista enlazada inicial? ¿Cómo reemplazaría mis listas vinculadas con la implementación proporcionada por sys/queue.h? ¿Cómo insertaría un elemento en la lista?

avatar de usuario
hombre de hojalata

LIST_ENTRY crea campos para colocar en su estructura que son adecuados para vincular los elementos, por lo que no tiene que preocuparse por los detalles de esos punteros.

struct foo {
    int a, b, c;
    /* This is instead of "struct foo *next" */
    LIST_ENTRY(foo) pointers;
};

Para luego crear una lista, usaría LIST_HEAD():

struct Torrent {
    LIST_HEAD(foo_list, foo) bar;
};

Puede inicializar el encabezado de la lista usando LIST_INIT():

struct Torrent t;
LIST_INIT(&t.bar);

Puede insertar elementos usando las macros LIST_INSERT_*():

struct foo *item = malloc(sizeof(struct foo));
LIST_INSERT_HEAD(&t.bar, item, pointers);

Todo esto fue tomado del ejemplo de la lista en las páginas del manual en http://www.manpagez.com/man/3/queue/

Para un ejemplo completo:
http://infnis.wikidot.com/list-from-sys-queue-h

  • Hola, estoy buscando un ejemplo de uso completo para la cola basado en <sys/queue.h> y parece que el enlace de ejemplo ya no es válido… ¿Quizás tienes un enlace alternativo?

    usuario7256215

    5 de noviembre de 2017 a las 11:40

¿Ha sido útil esta solución?