在学习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