C 在内核模块中使用asprintf
我有一个内核模块,在那里我使用具有读取权限的procfs文件,C 在内核模块中使用asprintf,c,linux,linux-kernel,linux-device-driver,C,Linux,Linux Kernel,Linux Device Driver,我有一个内核模块,在那里我使用具有读取权限的procfs文件, 从用户空间读取时,我需要在本地创建格式化字符串,然后复制到用户。 应该写入缓冲区的数据大小未知——这就是为什么我想在内核中使用类似asprintf的东西。有类似的吗?还是别的主意 提前谢谢 最简单的选择是使用proc\u create\u single\u data创建文件。其中一个参数是指向“show”函数的指针,该函数在读取文件时生成数据。“show”函数有一个struct seq_file*和一个上下文指针,该指针通过proc
从用户空间读取时,我需要在本地创建格式化字符串,然后复制到用户。
应该写入缓冲区的数据大小未知——这就是为什么我想在内核中使用类似asprintf的东西。有类似的吗?还是别的主意
提前谢谢 最简单的选择是使用
proc\u create\u single\u data
创建文件。其中一个参数是指向“show”函数的指针,该函数在读取文件时生成数据。“show”函数有一个struct seq_file*
和一个上下文指针,该指针通过proc_create_single_data
传递。您可以使用诸如seq_printf
之类的函数将格式化的字符串数据写入proc文件。它是否更昂贵?性能我的意思是..这取决于您是否希望显示超过4095字节的数据。如果您在proc文件中写入的内容超过这个数量,它将继续加倍其缓冲区大小,丢弃旧的“show”输出,并再次调用“show”函数,直到它适合为止。(但是,一旦增加了缓冲区大小,它将保持该缓冲区大小,直到proc文件关闭。)asprintf
在内核中不存在。最接近的等价物是kasprintf
,它打印到动态分配的缓冲区中,之后需要kfree
。就效率而言,它总是执行两次格式化输出,第一次使用空缓冲区来确定输出长度,第二次使用正确长度的动态分配缓冲区。使用seq_printf时-在哪个阶段将数据复制到用户?而且,如果我想读取4096字节以上的数据,我是否应该使用最大的本地缓冲区来实现我自己的读取,并在缓冲区已满时进行复制?