我正在制作一个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 +)
答案 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。