如何调用file_operations结构里的一些函数?

[复制链接]
 楼主| dqstar 发表于 2008-4-22 16:00 | 显示全部楼层 |阅读模式
static struct file_operations cs3_fops = {
        owner:     THIS_MODULE,
        write:       s3_write,
        ioctl:         s3_ioctl,
        open:       s3_open,
        release:    s3_close,
        read:        cs3_read,
};

各个函数体都写了,insmod()和rmmod()也写好
模块以经插入进内核了
mknod创建一个设备文件节点也搞好了(假如/dev/etc/s3)

我看到许多书上的测试程序,就用一个
fd=open(s3,O_RDWR)
打开这个设备文件

read(s3_fd,buf,256);
来测试这个驱动

我想知道这个file_operations结构体里的比如open,read,ioctl 等等一些函数体是如何调用的?测试程序里也没用到这些函数吧
gzweiyan 发表于 2008-4-22 19:27 | 显示全部楼层

建议多看书

fd=open(s3,O_RDWR)这一句会调用s3_open;
read(s3_fd,buf,256);这一句会调用cs3_read;
write();会调用s3_write;
ioctl...
 楼主| dqstar 发表于 2008-4-23 10:40 | 显示全部楼层

这个还真是不好理解

在应用程序里面调用open/write 系统就自动调用这驱动程序file_oprerations结构体里面的open/write了?
应用程序里面的open/write本身不是有定义的吗
flanker 发表于 2008-4-24 22:42 | 显示全部楼层

土人,初始化驱动模块的时候,以回调函数挂接在内核里面

回调函数就是函数指针。
调用ioctl、write、read的时候,其实就是跑到了这些函数指针里面。
宇宙飞船 发表于 2008-4-27 14:32 | 显示全部楼层

加载的时候就以链表的方式注册到内核里了,

调用的时候就用遍历的方法,先找到模块的名字,计算得到偏移量,然后得到函数指针地址,动作就这么简单。就象C++的对象工作原量差不多,对象里包含了,数据,方法等,但这是用C实现了C++中的对象方法。非常的吸引人!
 楼主| dqstar 发表于 2008-4-27 21:47 | 显示全部楼层

谢谢各位有心人

有一点点了解了
flanker 发表于 2008-5-4 22:11 | 显示全部楼层

C实现C++面向对象方法,这句话说的很好

  要知道,C++的对面向对象的支持,其实只是增加了一些方便。
  比如C语言在结构体中定义函数钩子,C++中以函数成员的形式更为直观,而且还具有不容易出错,自动初始化等等好处。如果C中定义了一个结构体,某些此类型的节点上又没有挂接钩子,那么一旦踩到就是空指针Kernel Panic。
  个人觉得,面向对象这个概念,关键的是设计思想,而不是语言。用C语言可以设计出很好的面向对象思想的程序,反过来,用C++/Java/C#这样号称面向对象的语言,使用者也可以抛弃其对面向对象提供的方便,设计出完全不是面向对象的程序。
  不过,很多时候面向对象未必就是好事情,一般地,当代码规模达到50K以上之巨时,面向对象才能体会出社会主义优越性来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部