对ldd3中注册字符设备的疑问
在LDD3字符设备驱动程序章节中,给出的注册字符设备的代码是这样:
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); /* A */
dev->cdev.owner = THISMODULE;
dev->cdev.ops = &scull_fops; /* B */
err = cdev_add(&dev->cdev,devno,1);
}
其中cdev_init函数原型:
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;
}
在这个函数中,已经有给cdev->ops赋值了。
为什么还要在行B中再次给它赋值呢? 没发现,关注下 额,这个确实有点怪哦, 至少我的所有字符设备驱动中都没有加dev->cdev.ops = &scull_fops 这一句 完全多余的。
没什么奇怪的啊。
大牛也有笔误和废话的时候。 回复 4# 奇门遁甲-lu
如果是笔误,那也太明显了吧,作者应该会注意到的。再者这本书都第3版了 回复 5# add358
就好比内核代码也有些冗余的代码。常看到一部分的补丁就修改像上面的这些冗余代码。 恩,看书时,我也在这行“多此一举”的代码上纠结了一小段时间啊。。。
这行应该是多余的。 :luya: 我也为此纠结了好久。。。 本事就是多余的。可以去掉B
页:
[1]