.read
操作应该在内核模块字符设备中返回什么?
我知道copy_to_user(...)
返回未复制的字节数,并且成功返回0.我看到如果read()
返回除0以外的任何内容,则使return -EFAULT
函数copy_to_user(...)
的示例。
但是一旦成功,this说要返回0并且this说要返回读取的字节数。什么应该回来?
我也应该检查一下
static ssize_t dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset)
比如检查buffer==NULL
或len == something
?如果是这样,我应该在一个恶劣的条件下返回什么?
.read
操作应返回:
此外,操作应更新*offset
值,因此从文件中进一步读取将返回下一部分数据。
如果驱动程序实现遵循此规则,则像cat
,dd
这样的标准命令将正确解释读取系统调用的结果,并且通过可能重复它,向用户输出设备的完整“内容”。
通常,在buffer
调用中检查copy_to_user
参数的正确性。如果此调用失败(返回非零),则通常由.read
返回-EFAULT。
len
参数很少检查错误。假设data_len
是重新生成数据的长度:
len
<data_len
,将第一个len
字节复制到缓冲区并返回len
len
> data_len
,将所有剩余的字节复制到缓冲区并返回data_len
data_len
或len
为0,则返回0有时,设备的数据只能通过预定义大小的部分读取。在这种情况下,您可以检查len
并返回-EINVAL以防它具有不适当的值。 buffer
也可以检查对齐。
例如,当.read
成功返回0时,它是正确的,直到设备被自己编写的用户空间程序使用,该程序不检查返回数据的实际长度。