what the that prints commands c linux list bsd

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



unix commands pdf (1)

Actualmente, he implementado una lista enlazada individualmente, como así:

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

... y tengo una estructura que contiene un par de estas listas vinculadas, así:

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

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

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

Luego, mirando la man queue , creo 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 en el uso de la lista. En la página del man , 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 en la lista? ¿No debería cada nodo estar conectado al siguiente nodo a través de un puntero, como la implementación de mi lista vinculada inicial? ¿Cómo reemplazaría mis listas vinculadas con la implementación provista por sys/queue.h ? ¿Cómo insertaría un elemento en la lista?


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 crear una lista, usarías LIST_HEAD ():

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

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

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

Puede insertar elementos utilizando las macros LIST_INSERT _ * ():

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

Todo esto se tomó de la lista de ejemplo en las páginas de manual en http://www.manpagez.com/man/3/queue/

Para un ejemplo completo: http://www.ideone.com/T1EID