linux kernel 常见函数解析

 

1.  list_for_each_entry 宏
    /*定义:*/

 #define list_for_each_entry(pos, head, member)                \
    for (pos = list_entry((head)->next, typeof(*pos), member);    \
         &pos->member != (head);     \
         pos = list_entry(pos->member.next, typeof(*pos), member))

    list_for_each_entry()它实际上是一个 for 循环,利用传入的 pos 作为循环变量,从表头 head 开始,逐项向后(next 方向)移动 pos,直至又回head.
    我们将for循环分解为一下三点:
    1) for循环初始化      pos = list_entry((head)->next, typeof(*pos), member);
    2) for循环执行条件  &pos->member != (head);
    3) 每循环一次执行   pos = list_entry(pos->member.next, typeof(*pos), member))
        
    /*定义*/

 #define list_entry(ptr, type, member) \
    container_of(ptr, type, member)    /* 作用:根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。 */


    * member 为成员变量
    * ptr 为接收指针
    * type 为结构体类型
    
    看一个例子吧:
    list_for_each_entry(sd, &v4l2_dev->subdevs, list){
    .../* 对sd进行操作 */
    }
    上面这个例子,其实是遍历v4l2_dev->subdevs(为list_head类型,一个双向链表),然后把v4l2_dev->subdevs所在的结构体变量的指针赋值给sd,
然后在循环中对sd进行操作

2. list_add和list_add_tail


  调用list_add可以将一个新链表结点插入到一个已知结点的后面;

  调用list_add_tail可以将一个新链表结点插入到一个已知结点的前面;

 

持续更新中...
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值