【问题标题】:Why a store function in the sysfs API of the Linux Kernel needs to return used bytes?为什么 Linux Kernel 的 sysfs API 中的 store 函数需要返回使用的字节?
【发布时间】:2013-04-15 21:22:13
【问题描述】:

来自文档:

  • store() 应该返回缓冲区中使用的字节数。如果 整个缓冲区已被使用,只需返回 count 参数。

这个值有什么作用?如果我从大小为 FOO 的缓冲区读取 4 而不是 6 字节,有什么区别?

【问题讨论】:

    标签: linux kernel sysfs


    【解决方案1】:

    你必须意识到,通过实现一个 sysfs 文件,你试图表现得像一个文件。

    让我们先从另一面来看。来自fwrite(3)的手册页:

    返回值
    fread() 和 fwrite() 返回成功读取或写入的项目数(即,不是字符数)。如果发生错误,或者文件结尾是 达到,返回值是一个短的项目计数(或零)。

    更好的是,来自write(2) 的手册页:

    如果底层物理介质或 RLIMIT_FSIZE 资源空间不足,则写入的字节数可能少于 count 遇到限制(请参阅 setrlimit(2)),或者在写入少于 count 个字节后调用被信号处理程序中断。 (另见管道(7)。)

    这意味着store(),它为您的特定文件实现write(2) 函数的另一端应该返回写入(即由您读取)的字节数,至少这样@987654325 @ 可以将该值返回给用户。

    在大多数情况下,如果输入没有错误,您只需返回 count 以确认您已阅读所有内容并且一切正常。

    【讨论】:

    • 很好(而且很快!)答案:-) 谢谢!
    • @maayank,快速提问。您是否设法弄清楚如何使用 sysfs 中的目录?我使用kobject_create_and_add,它需要一个父节点来创建目录,但我不知道如何获取指向现有节点的指针! (我给NULL,所以它会在sysfs的根目录下创建一个目录)。
    • 如果您使用设备/类/总线等,这有点不同(相同的想法,不同的函数名称),但我所做的是创建一个类结构并使用 class_register() 注册它。如果我需要该目录中的文件,我会添加(在注册之前)默认属性。如果我需要在我创建的类目录中的目录,我使用 device_create() 创建一个设备(它接收类结构以供参考)并在类结构的“dev_attrs”字段中添加“文件”。我不知道这是否是“Linux 内核方式”,但它符合我正在使用的项目规范。
    • ^^ 这将为您提供 FOO 类和设备 BAR 以及名为 FILE 的 BAR 中的文件 /sys/class/FOO/BAR/FILE。如果您希望文件夹位于特定的 /sys/something 下,则需要查找“某物”引用的特定模型 API(即用于块的块设备)
    • 我明白了,谢谢。知道如何获得/sys/module/ 的句柄吗?当您插入一个模块时,会在/sys/module/module_name 下自动创建一个文件夹。我很高兴知道如何在该特定文件夹下添加文件。我无法想象像sysfs_get_self() 这样的函数不存在。
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 2014-04-09
    • 2011-04-13
    • 2018-11-20
    • 1970-01-01
    • 2013-08-13
    • 2021-01-23
    • 2015-11-17
    相关资源
    最近更新 更多