读写文件节点---echo与read、write均可
2013-06-23 22:41
309 查看
#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/device.h> #include <asm/uaccess.h> MODULE_LICENSE("GPL"); #define DEVICE_NAME ("my_dev") #define GLOBALMEM_SIZE 512 /*全局内存最大4K字节*/ int MAJOR_NUM = 666; char g_val[20]; struct device *dev; struct class *myclass; static ssize_t global_read(struct file *filp, char __user *buf, size_t len, loff_t *off) { int ret; char val[20]; printk(KERN_ERR "###### global_read \n"); sprintf(val, "%s\n", g_val); //ssize_t simple_read_from_buffer(void __user *to, size_t count,loff_t *ppos, const void *from, size_t available); ret = simple_read_from_buffer(buf, len, off, val, strlen(val)); return ret; } static ssize_t global_write(struct file *filp, const char __user *buf, size_t len, loff_t *off) { int ret = 0; char val[20]; int i =0, j = 0; unsigned long p = *off; unsigned int count = len; memset(val, 0, 20); /*分析和获取有效的写长度*/ if (p >= GLOBALMEM_SIZE) { return count ? - ENXIO: 0; } if (count > GLOBALMEM_SIZE - p) { count = GLOBALMEM_SIZE - p; } if(copy_from_user(val, buf, count)) { ret = -EFAULT; } else { *off += count; ret = count; } memset(g_val, 0, 20); for(i = 0; i < strlen(val); i++) { if(val[i] >= '0' && val[i] <= '9') { g_val[j] = val[i]; j++; } } return ret; } struct file_operations fileops = { .read = global_read, .write = global_write, }; static int __init globalvar_init(void) { int ret; memset(g_val, 0, 20); printk(KERN_ERR "golabvar_init \n"); ret = register_chrdev(MAJOR_NUM, "my_driver", &fileops); if(ret) { printk(KERN_ERR "register_chrdev fail \n"); } else { printk(KERN_ERR "register_chrdev sucess \n"); //注册一个类,使mdev可以在"/dev/"目录下 面建立设备节点 myclass = class_create(THIS_MODULE, DEVICE_NAME); //创建一个设备节点,节点名为DEVICE_NAME dev = device_create(myclass, NULL, MKDEV(MAJOR_NUM, 0), NULL, DEVICE_NAME); if(!dev) { printk(KERN_ERR "device_create faile \n"); } } return 0; } static void __exit globalvar_exit(void) { printk("golabvar_exit \n"); device_destroy(myclass, MKDEV(MAJOR_NUM, 0)); class_destroy(myclass); unregister_chrdev(MAJOR_NUM, "globalvar"); } module_init(globalvar_init); module_exit(globalvar_exit);
相关文章推荐
- Java基础之读文件——使用通道随机读写文件(RandomReadWrite)
- CreateFile ReadFile WriteFile读写文件操作
- ReadWriteLock读写文件
- linux下文件的读写操作( open read write)
- Qt Write and Read XML File 读写XML文件
- [Win32]ReadFile/WriteFile 的文件同步读写
- 【问题笔记】关于c++文件读写 read write gcount的尝试
- linux c通过文件描述符以及write和read方法对文件进行读写
- sys_read()/vfs_read()/vfs_write() Linux VFS文件系统之读写(read/write)文件
- FileStream、Read和Write对文件的读写
- sys_read()/vfs_read()/vfs_write() Linux VFS文件系统之读写(read/write)文件
- Python 文件/文件夹操作(读写read/write、复制copy、删除delete、重命名rename)
- Linux VFS文件系统之读写(read/write)文件
- Linux C编程学习笔记(3):read、write、lseek函数及文件读写和文件读写指针的移动操作
- [perl] Spreadsheet::WriteExcel 和 Spreadsheet::Read 对 excel 文件的读写
- linux下文件的读写操作(open read write)
- RandomAccessFile,read,write,复制文件,指针,批量读写,基本类型读写
- 四种读写文件的方式:系统调用(open/read/write),C语言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型算法
- Linux下文件的读写操作( open read write)
- linux下文件的读写操作(openreadwrite)