以下代码摘自经典书籍 Linux设备驱动程序(第3版,第57页)
static void scull_setup_cdev(struct scull_dev *dev, int index)
{
int err, devno = MKDEV(scull_major, scull_minor + index);
cdev_init(&dev->cdev, &scull_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &scull_fops;
err = cdev_add (&dev->cdev, devno, 1);
/* Fail gracefully if need be */
if (err)
printk(KERN_NOTICE "Error %d adding scull%d", err, index);
}
令我困惑的是陈述dev->cdev.ops = &scull_fops;
。由于前面的语句cdev_init(&dev->cdev, &scull_fops);
将执行相同的操作,即cdev_init()
将执行dev->cdev.ops = &scull_fops;
,因此以下dev->cdev.ops = &scull_fops;
没有意义。
这是这本书的错误吗?
答案 0 :(得分:2)
我相信你是对的。他们肯定似乎对相同的数据结构做了同样的事情。此异常也列在本书的Unconfirmed Errata部分的网站上。因此,除非你是那个提交勘误建议的人,否则其他人也会做出同样的假设。该条目大约是页面的四分之一。搜索“scull_fops”将带您直接进入。