Добавление элемента дважды в двойной связанный список ядра Linux - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь использовать реализацию двусвязного списка ядра Linux, упомянутую в https://github.com/torvalds/linux/blob/master/include/linux/list.h, в пространстве пользователя, где его реализация в пространстве пользователя можно найти в https://gist.github.com/roychen/1710968

. Ниже приведен кодкоторый я использовал вначале, и он прекрасно работает:)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "list.h"

struct Node
{
    int data;
    char name[10];
    struct list_head mylist;
};

int main()
{
    LIST_HEAD(plist);

    struct Node node1 = {.data = 10, .name = "node1", .mylist = LIST_HEAD_INIT(node1.mylist)};
    struct Node node2;

    node2.data = 20;
    strcpy(node2.name, "node2");
    INIT_LIST_HEAD(&node2.mylist);

    list_add_tail(&node1.mylist, &plist);
    list_add_tail(&node2.mylist, &plist);

    struct Node* iter;

    list_for_each_entry(iter, &plist, mylist)
    {
        printf("name = %s, data = %d\n", iter->name, iter->data);
    }

    return 0;
}

вывод кода выше

name = node1, data = 10
name = node2, data = 20

, как и ожидалось.

теперь предположим, чтоЯ хочу добавить node1 дважды

Сценарий № 1:

    list_add_tail(&node1.mylist, &plist);
    list_add_tail(&node1.mylist, &plist);

Выход 1:

name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
name = node1, data = 10
... -> non-stopping loop (to infinity)

Сценарий № 2:

    list_add_tail(&node1.mylist, &plist);
    list_add_tail(&node2.mylist, &plist);
    list_add_tail(&node1.mylist, &plist);

вывод 2:

name = node1, data = 10 (-> just one node is added to the list instead of 3 nodes)

Приведенные выше результаты показывают, что в реализации list.h есть ошибка, по крайней мере, в одном из ее макросов функций.

НадеюсьНе знаю, где ошибка, которую мы не можем добавить в связанный список дважды .

Есть идеи ?! : |

***** РЕДАКТИРОВАТЬ ***** Сценарий 3:

    list_add_tail(&node1.mylist, &plist);
    list_add_tail(&node2.mylist, &plist);
    list_add_tail(&node1.mylist, &plist);

    struct Node* iter;

    list_for_each_entry_reverse(iter, &plist, mylist)
    {
        printf("name = %s, data = %d\n", iter->name, iter->data);
    }

вывод 3:

name = node2, data = 20
name = node1, data = 10
name = node2, data = 20
name = node1, data = 10
name = node2, data = 20
name = node1, data = 10
name = node2, data = 20
name = node1, data = 10
name = node2, data = 20
name = node1, data = 10
... -> non-stopping loop (to infinity)

1 Ответ

1 голос
/ 31 октября 2019

Связанный список Linux не поддерживает добавление узла более одного раза. Вы не можете добавить его дважды в один и тот же список и не можете добавить его в два разных списка.

...