快速业务通道

深入浅出Linux设备驱动编程--字符设备驱动程序

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-07-04
} write( ) 函数 当设备特殊文件进行write () 系统调用时,将调用驱动程序的write () 函数: ssize_t (*write) (struct file *, const char *, size_t, loff_t *); 向设备发送数据.如果没有这个函数,write 系统调用会向调用程序返回一个-EINVAL.如果返回值非负,则表示成功写入的字节数. globalvar_write函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off) { copy_from_user(&global_var, buf, sizeof(int)); } ioctl() 函数 该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,函数原型为: int (*ioctl) (struct inode * ,struct file * ,unsigned int ,unsigned long); unsigned int参数为设备驱动程序要执行的命令的代码,由用户自定义,unsigned long参数为相应的命令提供参数,类型可以是整型、指针等.如果设备不提供ioctl 入口点,则对于任何内核未预先定义的请求,ioctl 系统调用将返回错误(-ENOTTY,“No such ioctl fordevice,该设备无此ioctl 命令”).如果该设备方法返回一个非负值,那么该值会被返回给调用程序以表示调用成功. llseek()函数该函数用来修改文件的当前读写位置,并将新位置作为(正的)返回值返回,原型为: loff_t (*llseek) (struct file *, loff_t, int); poll()函数poll 方法是poll 和select 这两个系统调用的后端实现,用来查询设备是否可读或可写,或是否处于某种特殊状态,原型为:unsigned int (*poll) (struct file *, struct poll_table_struct *); 我们将在“设备的阻塞与非阻塞操作”一节对该函数进行更深入的介绍. 设备“gobalvar”的驱动程序的这些函数应分别命名为gobalvar_open、gobalvar_ release、gobalvar_read、gobalvar_write、gobalvar_ioctl,因此设备“gobalvar”的基本入口点结构变量gobalvar_fops 赋值如下: struct file_operations gobalvar_fops = { read: gobalvar_read, write: gobalvar_write, }; 上述代码中对gobalvar_fops的初始化方法并不是标准C所支持的,属于GNU扩展语法. 完整的globalvar.c文件源代码如下: #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <asm/uaccess.h> MODULE_LICENSE("GPL"); #define MAJOR_NUM 254 //主设备号编译上述文件: gcc –o globalvartest.o globalvartest.c 运行 ./globalvartest.o可以发现“globalvar”设备可以正确的读写.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号