一、读操作实现
ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos);
完成功能:读取设备产生的数据
参数:
filp:指向open产生的struct file类型的对象,表示本次read对应的那次open
pbuf:指向用户空间一块内存,用来保存读到的数据
count:用户期望读取的字节数
ppos:对于需要位置指示器控制的设备操作有用,用来指示读取的起始位置,读完后也需要变更位置指示器的指示位置
返回值:
本次成功读取的字节数,失败返回-1
put_user(x,ptr)
x:char、int类型的简单变量名
unsigned long copy_to_user (void __user * to, const void * from, unsigned long n)
成功为返回0,失败非0
ssize_t mychar_read(struct file *pfile, char __user *puser, size_t count, loff_t *ppos)
{struct mychar_dev *pmydev=(struct mychar_dev *)pfile->private_data;int size=0;//实际读的长度int ret=0;if(count>pmydev->curlen){size=pmydev->curlen;}else{size=count;}ret=copy_to_user(puser,pmydev->mydev_buf,size);if(ret){printk("copy_to_user is failed\n");return -1;}memcpy(pmydev->mydev_buf,pmydev->mydev_buf+size,pmydev->curlen-size);pmydev->curlen-=size;return size;}
二、写操作实现
ssize_t xxx_write (struct file *filp, const char __user *pbuf, size_t count, loff_t *ppos);
完成功能:向设备写入数据
参数:
filp:指向open产生的struct file类型的对象,表示本次write对应的那次open
pbuf:指向用户空间一块内存,用来保存被写的数据
count:用户期望写入的字节数
ppos:对于需要位置指示器控制的设备操作有用,用来指示写入的起始位置,写完后也需要变更位置指示器的指示位置
返回值:
本次成功写入的字节数,失败返回-1
get_user(x,ptr)
x:char、int类型的简单变量名
unsigned long copy_from_user (void * to, const void __user * from, unsigned long n)
成功为返回0,失败非0
ssize_t mychar_write (struct file *pfile, const char __user *puser, size_t count, loff_t *ppos)
{struct mychar_dev *pmydev=(struct mychar_dev *)pfile->private_data;int size=0;int ret=0;if(count>BUFSIZE-pmydev->curlen){size=BUFSIZE-pmydev->curlen;}else{size=count;}ret=copy_from_user(pmydev->mydev_buf,puser,size);if(ret){printk("copy_from_user is failed\n");return -1;}pmydev->curlen+=size;return size;
}
在通过应用层app调用
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include "mychar.h"int main(int argc,char *argv[])
{int fd = -1;char buf[8] = "";int max = 0;int cur = 0;if(argc < 2){printf("The argument is too few\n");return 1;}fd = open(argv[1],O_RDWR);if(fd < 0){printf("open %s failed\n",argv[1]);return 2;}write(fd,"hello",6);read(fd,buf,8);printf("buf=%s\n",buf);close(fd);fd = -1;return 0;
}