2

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

我用 a 创建一个结构list_head并从那里开始没有问题,但我的最终问题是我希望用不同的变量执行完全相同的函数。也就是说,我只想让一个write_proc最终为每个文件写入内核内存中的不同缓冲区(以及read_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) {

现在,我可以静态地创建一堆函数并确保分配足够多的函数,但我想知道是否有更优雅的解决方案。

这是我希望它在用户空间中如何显示的示例(我没有代码 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+)

4

2 回答 2

1

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

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

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

Well actually it does. If you look at the prototype of either function:

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);
                                    ^^^^^^^^^^

You will see a parameter called data which is a generic void *. Using this parameter, you can make the same function work with different variables.

Now create_proc_entry is not the best function for this. In fact, there is a replacement for it1, which also matches a better naming scheme for /proc functions. Looking at the source code itself, you can see the signature of create_proc_data and how it works. Using this function, you can provide the pointer to the working area of the /proc file. This pointer will be passed to both your read and write functions.

This is very similar to how pthread work for example, and many other libraries that take function pointers as callbacks.


1 If I'm not mistaken, create_proc_entry is deprecated.

于 2013-04-22T13:30:57.797 回答
0

看来您正在寻找create_proc_entry功能。它可以在运行时创建一个 proc 条目。例如,请参阅此处的详细信息。

于 2013-04-22T13:18:24.807 回答