动态生成proc文件?

时间:2013-04-22 02:38:40

标签: linux-kernel kernel-module

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

创建一个带有list_head的结构并从那里开始没有问题,但我的最终问题是我希望使用不同的变量执行完全相同的函数。也就是说,我只想让write_proc最终写入内核内存中的不同缓冲区,用于每个文件(以及从中读取的read_proc)。

我遇到这个问题的原因是从proc文件读取/写入的函数protoype似乎不允许这种行为:

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,因为我不知道从哪里开始):

$ echo "file1" > /proc/mydir/create
$ echo "file2" > /proc/mydir/create
$ ls /proc/mydir
  create  file1  file2
$ echo "1" > /proc/mydir/file1
$ echo "5" > /proc/mydir/file2
$ cat /proc/mydir/file*
  1
  5

我刚刚离开了深渊吗?

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

2 个答案:

答案 0 :(得分:1)

  

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

我假设您已经能够创建/ proc文件了。正如Ilya所说,create_proc_entry完成了工作(即使有更好的选择)。

  

我遇到这个问题的原因是从proc文件读取/写入的函数protoype似乎不允许这种行为

实际上确实如此。如果你看一下这两个函数的原型:

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_proc_entry不是最好的功能。实际上,有一个替代它 1 ,它也匹配/ proc函数的更好的命名方案。查看the source code itself,您可以看到create_proc_data的签名及其工作原理。使用此函数,您可以提供指向/ proc文件的工作区域的指针。该指针将传递给您的读写函数。

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


1 如果我没弄错的话,create_proc_entry已被弃用。

答案 1 :(得分:0)

您似乎正在寻找create_proc_entry功能。它可以在运行时创建一个proc条目。例如,请参阅此处的details