字符设备 mem_read()函数
/*读函数*/ static ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos) { int num = MINOR(filp->f_inode->i_rdev); ssize_t retval=0; //ssize_t:long,size_t:unsigned long ssize_t count=buf_size; count=(size>count)?(count):(size); //判断读位置是否有效 /* 最大空间4096,如果写入100字节,就只有100字节有效 */ /* 此时要读取4096字节,最多返回100字节,超过100字节部分,返回0表示失败,应用程序要读4096,但实际只读到100 */ //*ppos为当前读写的位置(当前访问位置从0开始) /* 如果*ppos还没到真实的大小时,继续读取,但是当*ppos超过了真实的大小时,则返回0, */ if(*ppos>=real_size) //*是否超出读取范围 return retval; if (num >= MEMDEV_NR_DEVS) return -ENODEV; printk(KERN_ALERT "Read chrdev.Major:%i Minor:%i\n",mem_major,num); //读数据到用户空间 if(copy_to_user(buf,buffer,count)) { retval=-EFAULT; goto err; } retval = count; *ppos+=count; //*将文件当前位置向后移,已经读取了的字节 real_size=count; //*返回实际读取字节数 printk(KERN_ALERT "Read %li bytes to chrdev.\n",count); err: return retval; //*返回实际读取字节数 }