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.hfor_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)->nextand headis&msgQueue->queueです。

于 2013-10-30T06:45:46.890 に答える