我一直在测试我的字符设备,我希望使用以下命令输出单个字符:
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
?
len
不是用户应用程序请求的字节数。这是一个缓冲区大小,一次最多可以读取len
字节,函数返回实际填充的数据大小。
如果返回 2 个字节,则第二个用户调用
ms_fd.read(&tmp, 1);
将不会调用 pir_ms_read()
,缓冲的数据将返回给用户应用程序。