删除list.h列表的第一个元素

时间:2013-10-30 06:36:05

标签: c list linux-kernel

(我正在使用linux / list.h实现一个名为msgQueue的队列)

typedef struct msgQueue
{
    long len;
    void *data;
    struct list_head queue;
} msgQueue

有很多迭代列表并删除节点的例子:

struct list_head *pos, *q;
struct msgQueue *currentQueue;

list_for_each_safe(pos, q, &(myQueue->queue))
{
    currentQueue = list_entry(pos, struct msgQueue, queue);
    list_del(pos);
    free(currentQueue);
}

删除第一个的安全方法是什么?

我原以为会:

list_del(*(myQueue->queue));

但这给了我一些问题。 (内核分页请求错误)

1 个答案:

答案 0 :(得分:2)

myQueue->queue是列表的头部,因此myQueue->queue->next是第一个条目。

鉴于“myQueue-> queue”是“struct list_head”(每条评论):

if (!list_empty(myQueue->queue))
    list_del(myQueue->queue.next);

似乎会删除第一个条目。

我使用了locate linux/list.h并查看了for_each函数的宏定义。

#define list_for_each_safe(pos, n, head) \
    for (pos = (head)->next, n = pos->next; pos != (head); \
        pos = n, n = pos->next)

因此,在循环的第一次迭代中,“pos”为(head)->nexthead&msgQueue->queue