- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
static ssize_t device_read (struct file* filp, char *bufStoreData, size_t bufCount, loff_t* curOffset)
{
printk(KERN_INFO"reading from the device");
ret = copy_to_user(bufStoreData,virtual_device.data,bufCount);
return ret;
}
copy_to_user 返回的是剩余要读取的字节数还是读取的字节数?
如果我正在使用 cat,bufcount 有什么用
如果在一次调用中没有读取所有数据,它如何读取剩余数据?应用程序是否有责任再次发出系统调用或驱动程序自动工作?
我需要了解这个基本概念。
最佳答案
copy_to_user()
返回无法复制到用户空间的字节数。如果可以复制完整的缓冲区,则返回 0。
通常,如果 !=0,意味着存在某种内存问题(写入合法的内存地址),因此应该检测到这些情况并报告给用户。
static ssize_t device_read (struct file* filp, char *bufStoreData,
size_t bufCount, loff_t* curOffset)
{
size_t bytes_to_copy;
printk(KERN_INFO"reading from the device");
/* do stuff to get device data into virtual_device.data . Also
update virtual_device.datasize */
bytes_to_copy = (virtual_device.datasize <= bufCount)?
virtual_device.datasize : bufCount;
/* note that I'm not using bufCount, but an hypothetical field in
virtual_device that gives me how much data the device has ready
for the user. I choose the lower of both */
/* Also recall that if the number of bytes requested by the user is
less than the number of bytes the device has generated, then the
next read should return the remainder of the device data, so the
driver should carry the count of how many bytes have been copied
to the user and how many are left. This is not covered in this
example. */
ret = copy_to_user(bufStoreData,virtual_device.data, bytes_to_copy);
if (ret != 0)
return -EPERM; /* if copy was not successful, report it */
return bytes_to_copy;
}
当用户发出 ret = read (fd, buffer, sizebuff);
时,它期望这些事情之一并且应该做出相应的 react :
ret
等于 sizebuff
。这意味着 read
可以返回用户请求的所有数据。这里没有其他事可做。
ret
为正,但小于 sizebuff
。这意味着读取给了用户一些数据,但没有他要求的那么多。如果需要,用户进程必须重新发出 read
系统调用以检索剩余数据。类似于:ret = read (fd, buffer+ret, sizebuff-ret);
ret
为 0。这意味着设备没有更多数据要发送。这是 EOF
条件。用户进程应该关闭设备。
ret
是 < 0。这是一个错误条件。用户进程必须检查errno
并采取适当的措施。
您的设备驱动程序必须根据读取设备时发生的情况在 device_read 中返回一个适当的值。
另一方面,像 cat
这样的进程期望每次 read
调用读取多达 4096 字节。如果设备发送的少于该值,它将打印接收到的数据并要求更多。 cat
只有在收到信号(例如 Ctrl-C
)或 read
调用返回不可恢复的错误(例如ENODEVICE
,如果出现这种情况,应该由您的驱动程序生成),或者读取 0 字节(EOF
条件)。
一个向用户进程返回“Hello, world”
的相当愚蠢的设备。它使用一些必须在 device_open
函数中重置的全局数据。请注意,如果多个进程要同时使用您的设备,则必须将这些全局数据转换为实例数据(使用 file->private_data
)。这个 device_read 示例展示了如何处理设备缓冲区和用户缓冲区,以及如何跟踪发送给用户的字节,因此设备永远不会发送比它拥有的更多的数据,永远不会发送比用户请求更多的数据,并且当设备数据用完,它返回 0 给用户。
int curindx = 0; /* should be reset upon calling device_open */
static ssize_t device_read (struct file* filp, char *bufStoreData,
size_t bufCount, loff_t* curOffset)
{
size_t bytes_to_copy;
char device_data[]="Hello, world!\n";
size_t remaindersize;
remaindersize = strlen(device_data) - curindx;
bytes_to_copy = (remaindersize <= bufCount)?
remaindersize : bufCount;
ret = copy_to_user(bufStoreData,device_data+curindx, bytes_to_copy);
if (ret != 0)
return -EPERM; /* if copy was not successful, report it */
curindx += bytes_to_copy;
return bytes_to_copy;
}
关于c - 如何在以下简单的设备读取程序中使用 'cat',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53098082/
这个问题在这里已经有了答案: standalone parentheses in javascript [duplicate] (5 个答案) 关闭 8 年前。 我在学习JavaScript,有时会
我是mysql新手,我必须减少以下更新查询的执行时间 UPDATE temp_countcalculations, ( SELECT count(*) as insuffcounts,CRP_
def escape_html(s): for (i, o) in (("&","&"),(">", ">"),(" "变成 ">"等。 关于python - 以下 for 循环
if (read(read(cin, data1), data2)) 问题是C++ Primer 5th Edition 的练习。 read 函数定义如下: std::istream &read(st
我想创建两个宏。其中一个将扩展到函数原型(prototype)和函数内容,另一个将扩展到仅函数原型(prototype)。我正在考虑创建以下内容: #ifdef SOME_CONDITION #def
我正在使用 jongo API - org.jongo.MongoCollection 是类。 我有对象 ID 列表并转换为与 ObjectId[] 相同并尝试按如下方式查询 collection.f
有人可以解释以下正则表达式匹配什么吗? ^.*$ 谢谢! 最佳答案 或者整个字符串或者整行,取决于是否multiline mode被使用。 关于java - 以下 ^.*$ 正则表达式匹配什么?,我们
#include void main() { int a,b,c; for(b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,TFy!QJ
我的代码段中的以下代码行被 Sonar 检测为问题。 代码段: final int Pending=1; Sonar 问题: Name 'Pending' must matc
Print name of all activities with neither maximum nor minimum number of participants 我尝试了以下查询,但出现错误:
这个问题在这里已经有了答案: What is this practice called in JavaScript? (7 个回答) 关闭8年前。 (function() { //do stuff
根据任务,我们必须通过 foldr 实现 foldl。通过比较函数签名和 foldl 实现,我得到了以下解决方案: myFoldl :: (a -> b -> a) -> a -> [b] -> a
这个问题在这里已经有了答案: Export an es6 default class inline with definition or at end of file? (1 个回答) 关闭 2 年
据我了解,以下是相同的: Person p{}; // Case 1 Person p = {}; // Case 1.5 我注意到 Person p = Person{}; // Case 2 产生
below i have given a javascript code picture `` can any one help me in this code. what do this code.
我想在标题和正文上搜索全文,并在答案计数上进行过滤。 我阅读了elasticsearch documentation for combining filters并构建了此查询。 "query": {
它是流动的 C 代码中的内存泄漏吗? #include int *a; int main() { a = malloc(sizeof(int)*10); return
这两个声明有什么区别: char (*ptr)[N]; 对比 char ptr[][N]; 谢谢。 最佳答案 (1)声明 char (*ptr)[N]; ptr 是指向大小为 N 的字符数组的指针 下
data II = I Int Int deriving (Show) instance II Show where show I a b = show (a+b) showt.hs:3:2: s
我从 clojuredoc 中阅读了关于 condp 的文档。在文档中我找到了以下代码: (condp 一些 [1 2 3 4] #{0 6 7} :>> 公司 #{4 5 9} :>> 十二月 #{
我是一名优秀的程序员,十分优秀!