0
点赞
收藏
分享

微信扫一扫

linux中的list

队列的操作,相关函数

INIT_LIST_HEAD();  

LIST_HEAD_INIT();

list_add_tail();  

list_del();          

list_entry();  

list_empty();   //判断是否是空的

list_for_each_entry();

宏、函数分析

 (list.h中)

    #define LIST_HEAD_INIT(name) { &(name), &(name) }

    #define LIST_HEAD(name) \

    struct list_head name = LIST_HEAD_INIT(name)

    static inline void INIT_LIST_HEAD(struct list_head *list)

    {

            list->next = list;

            list->prev = list;

    }

定义、初始化list_head的方法

    法一:

        static LIST_HEAD(head);

    法二:

        struct list_head head = LIST_HEAD_INIT(head);

    法三:

        struct list_head head;

        INIT_LIST_HEAD(&head)

list_entry(ptr, type, member)

返回值:结构体指针

    ptr:              要取出的list_head的头部

    type:           要取出什么类型的结构体

    member:    type结构体中链入ptr的list_head成员名字。

    例:《第2课第1.1.4节_摄像头驱动_从零写一个虚拟驱动_P》:

        struct videobuf_buffer {

                ...

                struct list_head   queue;

                ...

         }

        static struct list_head myvivi_vb_local_queue;

        static void myvivi_timer_function(unsigned long data)

        {

                struct videobuf_buffer *vb;

          vb = list_entry(myvivi_vb_local_queue.next, struct videobuf_buffer, queue);

                ...

        }

list_for_each_entry(pos, head, member)  

是一个for(...)

    pos:             作为for(...)括号内的指针,从而可以对pos进行操作

    head:           list_head的头部

    member:     链入head的结构体的list_head成员名称。(member一般和*pos在同一个结构体中)

    例:

        static LIST_HEAD(local_list);

        struct videobuf_buffer {

                ...

                enum videobuf_state  state;

                ...

        }

        struct videobuf_queue {

                ...

                struct videobuf_buffer  *bufs[VIDEO_MAX_FRAME];

                struct list_head   stream;

                ...

        }

        int videobuf_streamon(struct videobuf_queue *q)

        {

               struct videobuf_buffer *buf;

               list_for_each_entry(buf, &local_list, stream)

               if (buf->state == VIDEOBUF_PREPARED)

               ...

        }

linux中的list_初始化



举报

相关推荐

0 条评论