container_of()宏

在学习linux驱动的过程中,遇到一个宏叫做container_of.该宏定义在include/linux/kernel.h中。

container_of()作用显而易见,就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。

比如,有一个结构体变量,其定义如下:

struct demo_struct {

      type1 member1;

      type2 member2;

      type3 member3;

      type4 member4;

};

struct demo_struct demo;

同时,在另一个地方获得了结构体变量demo中的某一个域成员变量的指针,比如:

type3 *memp = get_member_pointer_form_somewhere();

此时,如果需要获取指向结构体变量demo的指针,我们就可以这样做:

struct demo_struct *demop = container_of(memp, struct demo_struct, member3);

这样,我们就通过结构体变量的一个域成员变量的指针,获得了指向整个结构体变量的指针。

conatiner_of():

参数1是指向结构体某个域成员变量的指针;

参数2是结构体的类型;

参数3是参数1中指针指向的结构体域成员变量的名字(注:是域成员变量的名字,不是类型);


我们再来看一个例子:

假设我们在实际程序中定义了一个字符设备结构体

struct globalmem_dev {

   struct cdev my_cdev;   

   unsigned char mem[GLOBALMEM_SIZE];

   struct seamphore sem;

};

则在后面的相关函数中我们可以这样用:

int globalmem_open(struct inode *inode, struct file *file)

{

   struct globalmem_dev *pdev;

   pdev = container_of(inode->i_cdev, struct globalmem_dev, my_cdev);

   file->private_data = pdev;

   if (down_trylock(&pdev->sem))  //获取信号量

            return -EBUSY;

   return 0;

}

转载于:http://blog.csdn.net/yuzaipiaofei/article/details/7226332

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值