Linux kernel 动态生成进程文件?

Linux kernel 动态生成进程文件?,linux-kernel,kernel-module,Linux Kernel,Kernel Module,我正在制作一个linux内核模块,我想知道是否有一种方法可以动态生成proc文件并以合理的方式使用它们 我可以创建一个带有列表头的结构,然后从那里开始,但我的最终问题是,我希望使用不同的变量执行完全相同的函数。也就是说,我只希望有一个write\u proc,它最终会为每个文件写入内核内存中的不同缓冲区(还有一个read\u proc,它从同一个文件读取) 我在这方面遇到困难的原因是,用于从proc文件读/写的函数原型似乎不允许这种行为: int read_proc(char *buf, cha

我正在制作一个linux内核模块,我想知道是否有一种方法可以动态生成proc文件并以合理的方式使用它们

我可以创建一个带有
列表头的结构,然后从那里开始,但我的最终问题是,我希望使用不同的变量执行完全相同的函数。也就是说,我只希望有一个
write\u proc
,它最终会为每个文件写入内核内存中的不同缓冲区(还有一个
read\u proc
,它从同一个文件读取)

我在这方面遇到困难的原因是,用于从proc文件读/写的函数原型似乎不允许这种行为:

int read_proc(char *buf, char **start, off_t offset, int count,
              int *eof, void *data) {

int write_proc(struct file *file, const char *buf,
               unsigned long count, void *data) {
现在,我可以静态地创建一组函数,并确保分配足够的函数,但我想知道是否有更优雅的解决方案

下面是我希望它在userland中的外观示例(我没有MWE代码,因为我甚至不知道从哪里开始):

我是不是已经走到尽头了


我正在寻找非常通用的兼容性(2.6.33+)

您似乎正在寻找
创建程序条目
函数。它可以在运行时创建proc条目。例如,请参见此处

我的最终问题是,我希望使用不同的变量执行完全相同的函数

我假设您已经能够创建/proc文件了。如前所述,
create\u proc\u entry
完成了这项工作(即使有更好的替代方案)

我在这方面遇到困难的原因是,从proc文件读取/写入的函数原型似乎不允许这种行为

事实上是这样的。如果您查看任一函数的原型:

int read_proc(char *buf, char **start, off_t offset, int count,
              int *eof, void *data);
                        ^^^^^^^^^^

int write_proc(struct file *file, const char *buf,
               unsigned long count, void *data);
                                    ^^^^^^^^^^
您将看到一个名为
data
的参数,它是一个通用的
void*
。使用此参数,可以使同一函数与不同的变量一起工作

现在
create\u proc\u entry
并不是最好的功能。事实上,it1有一个替代品,它也与/proc函数的更好命名方案相匹配。查看,您可以看到
create\u proc\u data
的签名及其工作方式。使用此函数,可以提供指向/proc文件工作区域的指针。此指针将同时传递给读函数和写函数

这非常类似于
pthread
的工作方式,例如,以及许多其他将函数指针作为回调的库



1如果我没有弄错的话,
create\u proc\u entry
不推荐使用。

我建议通过我提供的链接查看/proc的实现。它非常简单,信息量也很大。事实上,阅读并使用它比从不完整的文档或过时的博客文章中查找信息更容易。非常感谢,很抱歉延迟接受答案,我最近没有太多时间来处理这个问题。由于某种原因,
数据
这件事我完全忘记了,尽管它正盯着我的脸看!再次感谢所有的细节和链接!
int read_proc(char *buf, char **start, off_t offset, int count,
              int *eof, void *data);
                        ^^^^^^^^^^

int write_proc(struct file *file, const char *buf,
               unsigned long count, void *data);
                                    ^^^^^^^^^^