【问题标题】:I am unable to use echo and cat in this simple device driver module.我无法在这个简单的设备驱动程序模块中使用 echo 和 cat。
【发布时间】:2014-01-11 19:33:09
【问题描述】:
    static ssize_t device_read (struct file* filp, char *bufStoreData, size_t bufCount, loff_t* curOffset)
    {
      printk(KERN_INFO"reading from the device");
      ret = copy_to_user(bufStoreData,virtual_device.data,bufCount);
      return ret;
    }

    static ssize_t device_write(struct file *filp,const char* bufSourceData,size_t bufCount, loff_t* curOffset)
    {
      printk(KERN_INFO"writing to device");
      ret=copy_from_user(virtual_device.data,bufSourceData,bufCount);
      return ret;
    }

我使用 echo 和 cat 命令进行用户读写,但我没有正确读取数据。也许我没有返回正确的值。是这样吗?

【问题讨论】:

    标签: c device linux-device-driver drivers


    【解决方案1】:

    device_read()device_write() 返回值是读/写字节数。 copy_to_user()copy_from_user() 如果复制了所有字节,则返回 0,否则返回未复制的字节数。

    可能您的操作成功并且您返回0,这意味着“0 字节复制”。

    成功时必须返回bufCount,失败时必须返回负错误代码。

    ret=copy_from_user(virtual_device.data,bufSourceData,bufCount);
    if (ret)
        return ret;
    
    return bufCount;
    

    【讨论】:

    • copy_{to,from}_user} 不返回错误代码;它们返回 not 复制的字节数(成功时为 0)。如果copy_... 函数返回非零结果,该函数可能应该返回-EINVAL
    • 问题是我在终端上得到了 N INFINITE 数量的输出......如何控制它?
    • @KeithThompson 是的,你是对的 :) 快速回答不假思索,我编辑我的答案
    • @mrigendra 你修复了你的模块吗?还是新问题?
    • 这不是一个新问题,我现在遇到这个问题 2 天了,我认为问题在于返回,但我不知道如何管理它...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多