为什么传递到我的字符设备的长度大于系统调用的读取长度?

问题描述 投票:0回答:1

我一直在测试我的字符设备,我希望使用以下命令输出单个字符:

int main() // c++ program
{
    while (true)
    {   
        char tmp = 'x';
        std::ifstream ms_fd;
        ms_fd.open(device_path, std::ios::binary);
        ms_fd.read(&tmp, 1);
        std::cout << "val: " << tmp << std::endl;

        ms_fd.read(&tmp, 1);
        assert(ms_fd.eof());
        ms_fd.close();
        sleep(2);
    }
    return 0;
}

我使用的读取调用仅适用于单个字符。但在我的设备驱动程序读取函数中,我收到长度为 8191 的读取

日志:

[  204.738324] READDRIVE:  reading len: [8191]  offset: [0]
[  204.738590] READDRIVE:  reading len: [8191]  offset: [1]
[  206.739116] READDRIVE:  reading len: [8191]  offset: [0]
[  206.739235] READDRIVE:  reading len: [8191]  offset: [1]

读取功能为:

static ssize_t pir_ms_read(struct file *filp, char __user *buf, size_t len, loff_t *off)
{
    pr_info("READDRIVE:  reading len: [%d]  offset: [%d]\n", len, *off);
    ssize_t retval;
    if (*off > 0)
    {
        retval = 0;
    }
    else
    {
        put_user(buf_state, buf);
        retval = 1;
        *off+=1;
    }
    return retval;
}

为什么读取没有通过参数

ssize_t len = 1

c++ linux-device-driver
1个回答
0
投票

len
不是用户应用程序请求的字节数。这是一个缓冲区大小,一次最多可以读取
len
字节,函数返回实际填充的数据大小。

如果返回 2 个字节,则第二个用户调用

ms_fd.read(&tmp, 1);
将不会调用
pir_ms_read()
,缓冲的数据将返回给用户应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.