关于使用这些功能,我有两个问题。我不完全理解here编写的文档:
sysfs分配大小为(PAGE_SIZE)的缓冲区,并将其传递给 方法。 Sysfs将为每次读取或调用仅一次调用该方法 写。这将强制以下行为 实现:
在read(2)上,show()方法应填充整个缓冲区。 回想一下,属性只能导出一个值,或者导出一个 相似值的数组,所以这不应该那么昂贵。
这允许用户空间进行部分读取和前向搜索 随意随意处理整个文件。如果用户空间回溯到 零或pread(2)的偏移量为'0',show()方法将执行 被再次调用,重新填充以填充缓冲区。
在write(2)上,sysfs期望整个缓冲区在 首先写。然后,Sysfs将整个缓冲区传递给store()方法。 存储的数据之后会添加一个终止null。这使得 像sysfs_streq()这样的函数可以安全使用。
在写入sysfs文件时,用户空间进程应首先读取 整个文件,修改希望更改的值,然后将 整个缓冲区返回。
首先,当我使用read/write
读取/写入sysfs属性文件时,是否保证我读取的缓冲区/ store
函数中的缓冲区将具有我想要的所有字节读取该功能,而不是分几个部分调用它?
此外,如何添加空字符?也就是说,假设我写了n个字节,函数参数中的写字节数是否为n,而空字符将被放置在n + 1?
谢谢
答案 0 :(得分:1)
第一个问题的答案是-不支持部分写入,并且总是在一次show方法调用中填充缓冲区。
第二个问题的答案也是。请参见sysfs使用的实现kernfs_fop_write()
-它将分配最多PAGE_SIZE + 1个字节,以便有足够的空间容纳\ 0。
答案 1 :(得分:0)
它分配 PAGE_SIZE
,如果写入了 >= PAGE_SIZE
,它会用 PAGE_SIZE
截断为 '\0'
并记录错误。如果写入了 > PAGE_SIZE
,则您可能损坏了内核内存。
为了保护,您应该使用 sysfs_emit
和 sysfs_emit_at
写入缓冲区。请参阅documentation。