为什么Linux内核的sysfs API中的存储函数需要返回已使用的字节?

为什么Linux内核的sysfs API中的存储函数需要返回已使用的字节?,linux,kernel,sysfs,Linux,Kernel,Sysfs,从文件中: store()应返回从缓冲区使用的字节数。如果 已使用整个缓冲区,只需返回count参数 它与这个值有什么关系?如果从大小为FOO的缓冲区读取4字节而不是6字节,有什么区别呢?您必须意识到,通过实现sysfs文件,您试图表现得像文件一样 让我们先从另一边看。从fwrite(3)的手册页: 返回值 fread()和fwrite()返回成功读取或写入的项目数(即,不是字符数)。如果发生错误,或文件结尾被删除 到达时,返回值为短项计数(或零) 更妙的是,在的手册页上写下(2): 例如,

从文件中:

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

它与这个值有什么关系?如果从大小为FOO的缓冲区读取4字节而不是6字节,有什么区别呢?

您必须意识到,通过实现sysfs文件,您试图表现得像文件一样

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

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

更妙的是,在
的手册页上写下(2)

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

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


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

您必须意识到,通过实现sysfs文件,您正试图表现得像文件一样

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

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

更妙的是,在
的手册页上写下(2)

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

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


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

很好(而且很快!)回答:-)谢谢@maayank,快速提问。您是否设法弄明白了如何在sysfs中使用目录?我使用
kobject\u create\u和\u add
创建目录时使用父节点,但我不知道如何获取指向现有节点的指针!(我给出了
NULL
,因此它在sysfs的根目录中创建了一个目录)。如果使用设备/类/总线等,则有点不同(相同的想法,不同的函数名),但我要做的是创建一个类结构,并用class_register()注册它。如果我需要该目录中的文件,我会(在注册之前)添加默认属性。如果我需要我创建的类目录中的目录,我将使用device_create()创建一个设备(它接收类结构以供参考),并在类结构的“dev_attrs”字段中添加该设备的“文件”。我不知道这是否是“Linux内核方式”,但它符合我正在使用的项目规范。^^这将为您提供类FOO和设备栏,以及名为file/sys/class/FOO/BAR/file的栏内文件。如果您希望文件夹位于特定的/sys/something下,那么您需要查找“something”引用的特定模型API(即block的block设备),谢谢。知道如何获取
/sys/module/
的句柄吗?插入模块时,将自动在
/sys/module/module\u name
下创建一个文件夹。我很高兴知道如何在特定文件夹下添加文件。我无法想象像
sysfs\u get\u self()@maayank,快速提问。您是否设法弄明白了如何在sysfs中使用目录?我使用
kobject\u create\u和\u add
创建目录时使用父节点,但我不知道如何获取指向现有节点的指针!(我给出了
NULL
,因此它在sysfs的根目录中创建了一个目录)。如果使用设备/类/总线等,则有点不同(相同的想法,不同的函数名),但我要做的是创建一个类结构,并用class_register()注册它。如果我需要该目录中的文件,我会(在注册之前)添加默认属性。如果我需要我创建的类目录中的目录,我将使用device_create()创建一个设备(它接收类结构以供参考),并在类结构的“dev_attrs”字段中添加该设备的“文件”。我不知道这是否是“Linux内核方式”,但它符合我正在使用的项目规范。^^这将为您提供类FOO和设备栏,以及名为file/sys/class/FOO/BAR/file的栏内文件。如果您希望文件夹位于特定的/sys/something下,那么您需要查找“something”引用的特定模型API(即block的block设备),谢谢。知道如何获取
/sys/module/
的句柄吗?插入模块时,将自动创建一个文件夹