打印

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

[复制链接]
2719|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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的时候,其实就是跑到了这些函数指针里面。

使用特权

评论回复
5
宇宙飞船| | 2008-4-27 14:32 | 只看该作者

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

调用的时候就用遍历的方法,先找到模块的名字,计算得到偏移量,然后得到函数指针地址,动作就这么简单。就象C++的对象工作原量差不多,对象里包含了,数据,方法等,但这是用C实现了C++中的对象方法。非常的吸引人!

使用特权

评论回复
6
dqstar|  楼主 | 2008-4-27 21:47 | 只看该作者

谢谢各位有心人

有一点点了解了

使用特权

评论回复
7
flanker| | 2008-5-4 22:11 | 只看该作者

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

34

帖子

1

粉丝