由于经常对list里的函数使用不是很熟练,因此写此文作为备用和记录,也方便记不清怎么利用这些函数的同学的需要。
1:list_for_each_entry()
struct i2c_dev {
struct list_head list;
struct i2c_adapter *adap;
struct device *dev;
};
struct i2c_dev *i2c_dev;
static LIST_HEAD(i2c_dev_list);
list_for_each_entry(i2c_dev, &i2c_dev_list, list) {
if (i2c_dev->adap->nr == index)
goto found;
}
速记方法:list_for_each_entry(大结构体,头节点,大结构体里的小结构体)
其中头节点,大结构体里的小结构体为同种结构体类型,这里为struct list_head
2:container_of()
static int i2c_device_probe(struct device *dev)
{
struct i2c_client *client = i2c_verify_client(dev);
struct i2c_driver *driver;
int status;
if (!client)
return 0;
driver = to_i2c_driver(dev->driver);
//#define to_i2c_driver(d) container_of(d, struct i2c_driver, driver)
//#define offset(type,member) ((size_t )&(((type *) 0)->member))
............................
}
速记方法:container_of(传入的被__mptr指向指针,大结构体类型,大结构体的小结构体)
返回的是指向大结构体类型的指针。
其中:传入的被__mptr指向指针和大结构体的小结构体类型相同。
3:list_for_each_safe(大体1,大体2,头节点,大体中的小体)