我正在学习Linux Device Drivers, 3rd edition的第 3.5 章。本节介绍一种方法来检索我们struct inode *inode
在 open 函数中定义的自定义结构:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev;
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
}
return 0;
}
据我了解,当设备打开时,struct inode *inode
代表设备的参数传递给scull_open
. 然后,自定义结构dev
被提取并传递给filp->private_data
其他方法,例如scull_read
可以使用它:
ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
loff_t *f_pos)
{
struct scull_dev *dev = filp->private_data;
/* other codes that uses *dev */
}
这对我来说似乎很好,直到我意识到我们已经struct scull_dev *dev
在scull_setup_cdev
这里进行了初始化。
我很困惑,因为我认为我们可以创建struct scull_dev *dev
一个全局变量,然后scull_read
其他方法最终将可以访问它,而无需通过使用inode
and的所有传递file
。
我的问题是,我们为什么不把它变成一个全局变量呢?
谁能提供一些使用这种方法传递数据的实际例子?