Linux デバイス ドライバー プログラミングの第 3 版を勉強していますが、open メソッドについていくつか質問があります。その本で使用されている「scull_open」メソッドは次のとおりです。
int scull_open(struct inode *inode, struct file *filp){
struct scull_dev *dev; /* device information */
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
/* now trim to 0 the length of the device if open was write-only */
if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) {
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
scull_trim(dev); /* ignore errors */
up(&dev->sem);
}
return 0; /* success */
}
そして私の質問は次のとおりです。
- この関数は、開いたばかりのデバイスにファイル記述子を返すべきではありませんか?
- "*filp" はこの関数に対してローカルではないのに、なぜ dev の内容をそれにコピーするのでしょうか?
- 後で読み取りおよび書き込みメソッドでどのように使用できるでしょうか?
誰かが私のオープンメソッドの典型的な「脂肪のない」実装を書くことができますか?
ssize_t scull_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos){ struct scull_dev *dev = filp->private_data; ...}