我正在研究Linux Device Drivers, 3rd edition的第3.5章。本節介紹檢索我們在open函數定義自己從struct inode *inode
自定義結構的方法:在Linux設備驅動程序編程中使用struct inode和struct文件傳遞數據的原因
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 */
}
這似乎沒什麼問題,直到我意識到,我們已經在scull_setup_cdev
here初始化過程中有一個struct scull_dev *dev
。
我,因爲我認爲我們可以struct scull_dev *dev
一個全局變量,然後scull_read
等方法,最終將有機會獲得它,而無需通過使用inode
和file
的所有傳球會比較混亂。
我的問題是,爲什麼我們不把它變成一個全局變量?
任何人都可以提供一些使用這種方法來傳遞數據的實際例子嗎?
讓這個問題/答案是一個教訓,你爲什麼全局變量是不好的,不應該被除非有沒有其他方式使用。 –
是的,但在教授作者時必須說明爲什麼以及特定功能的用途。 – mrigendra