1

(我正在使用 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));

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

4

1 回答 1

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” is(head)->nextheadis &msgQueue->queue

于 2013-10-30T06:45:46.890 回答