(我正在使用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));
但这给了我一些问题。 (内核分页请求错误)
答案 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)->next
,head
为&msgQueue->queue
。