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