Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在内核模块中使用asprintf_C_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

C 在内核模块中使用asprintf

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

我有一个内核模块,在那里我使用具有读取权限的procfs文件,
从用户空间读取时,我需要在本地创建格式化字符串,然后复制到用户。
应该写入缓冲区的数据大小未知——这就是为什么我想在内核中使用类似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字节以上的数据,我是否应该使用最大的本地缓冲区来实现我自己的读取,并在缓冲区已满时进行复制?