Wie verwende ich die Liste von sys/queue.h?

Lesezeit: 2 Minuten

Derzeit habe ich eine einfach verknüpfte Liste wie folgt implementiert:

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

… und ich habe eine Struktur, die ein paar dieser verknüpften Listen enthält, etwa so:

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

Ich möchte dies durch die Verwendung der von bereitgestellten Makros ersetzen sys/queue.h. Ich nehme an, dass ich meinen Code durch so etwas ersetzen könnte:

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

Dann, vom Betrachten man queueich glaube, ich würde die Listen initialisieren, indem ich so etwas mache:

LIST_INIT(&peer_list);
LIST_INIT(unchoked_peers);

Allerdings verstehe ich nicht wie LIST_ENTRY Faktoren bei der Verwendung der Liste. Von dem man Seite, da steht: “Das Makro LIST_ENTRY deklariert eine Struktur, die die Elemente in der Liste verbindet”, aber ich verstehe nicht wirklich, was das bedeutet.

Warum sollte ich eine Struktur deklarieren wollen, um die Elemente in der Liste zu verbinden? Sollte nicht jeder Knoten über einen Zeiger mit dem nächsten Knoten verbunden sein, wie bei meiner anfänglichen Linked-List-Implementierung? Wie würde ich meine verknüpften Listen durch die von bereitgestellte Implementierung ersetzen? sys/queue.h? Wie würde ich ein Element in die Liste einfügen?

Benutzer-Avatar
Blechmann

LIST_ENTRY erstellt Felder, die Sie in Ihre Struktur einfügen können und die zum Verknüpfen der Elemente geeignet sind, sodass Sie sich nicht mit den Besonderheiten dieser Zeiger befassen müssen.

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

Um dann eine Liste zu erstellen, würden Sie LIST_HEAD() verwenden:

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

Sie können den Listenkopf mit LIST_INIT() initialisieren:

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

Sie können Elemente mit den Makros LIST_INSERT_*() einfügen:

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

Dies wurde alles aus dem Listenbeispiel in den Manpages unter entnommen http://www.manpagez.com/man/3/queue/

Für ein vollständiges Beispiel:
http://infnis.wikidot.com/list-from-sys-queue-h

  • Hallo, ich suche ein umfassendes Anwendungsbeispiel für die Warteschlange basierend auf <sys/queue.h> und es scheint, als ob der Beispiellink nicht mehr gültig ist. Vielleicht haben Sie einen alternativen Link?

    Benutzer7256215

    5. November 2017 um 11:40 Uhr

1363940cookie-checkWie verwende ich die Liste von sys/queue.h?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy