字符设备驱动 mem_read()函数

字符设备 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;	//*返回实际读取字节数
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值