繁体   English   中英

并非所有内容都由内核模块正确发送给用户

[英]Not everything is sent properly to the user by kernel module

我有这样的功能

static ssize_t read_mydevice(struct file *filp, char* buf, size_t count, loff_t* ppos) {

 char *text = "Device is empty\n";
    int len = strlen(text);


    if (*ppos != 0)
            return 0;


    if(count>bytesindev) count=bytesindev;
    if(bytesindev==0) {

        if (copy_to_user(buf, text, len))
                 return -EINVAL;
     } else {
        while(count>0) {
        if (copy_to_user(buf++, msg_Ptr, (unsigned long) 1)) {
                 return -EINVAL;
                } else {
                    strcpy(msg_Ptr, (msg_Ptr+1));
                    bytesindev-=1;
                    *(msg_Ptr+bytesindev) = '\0';
                }
                count-=1;
                printk(KERN_INFO "%d\n", count);
            }
            printk(KERN_INFO "%s\n", buf);
     }
    /*
     * Tell the user how much data we wrote.
     */
    *ppos = len;

    return len;

 }

问题是用户没有得到完整的信息,它始终是它的第一个13-16标志,循环被做了很多次,它应该是。 首先传递给copy_to_user的第三个参数是整个消息的长度,但是这个解决方案也无法正常工作。 有任何想法吗? 该函数应该为用户提供他所需的缓冲区的一部分(首先写入缓冲区的字节数,有点像FIFO)。 必须先将数据发送到设备。 这是写作的功能:

static ssize_t
write_mydevice(struct file *filp, const char *buff, size_t len, loff_t * off)
{
if(bytesindev+len>limit) {
    if(limit-bytesindev<=0) {
        printk(KERN_ALERT "Device is full.\n");
            return -EINVAL;
    } else {
        printk(KERN_INFO "Device almost full.\n");
        strncat(msg_Ptr, buff, limit-bytesindev);
        bytesindev+=limit-bytesindev;
        return limit-bytesindev;
    }
} else {
    //printk(KERN_INFO "Device working\n");
    strncat(msg_Ptr, buff, len);
    bytesindev+=len;
    return len;
} 
}

代码的意图对我来说并不完全清楚,但至少存在一个问题。 strcpy调用无效。 不保证可以使用重叠缓冲区:

strcpy(msg_Ptr, (msg_Ptr+1));

它可能具有预期的结果,但它是未定义的行为。 strcpy

问题是read函数返回错误的值,它总是返回文本的长度,而不是已发送消息的长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM