2013-04-22 122 views
2

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

我没有问题创建一个结构与list_head并从那里,但我最终的问题是,我想有完全相同的函数执行不同的变量。也就是说,我只是想有一个write_proc即最终写入内核内存不同的缓冲区为每个文件(和read_proc从同一个读取)。

我遇到这种困难的原因是,似乎读取功能protoypes /从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+)

回答

1

我最终的问题是我想要用不同的变量执行完全相同的功能。

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

我遇到这种困难的原因是,似乎读取功能protoypes /从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_proc_entry是不是我们的最佳功能。实际上,它有一个替代它的,它也匹配更好的/ proc函数的命名方案。查看the source code itself,您可以看到create_proc_data的签名以及它的工作原理。使用这个函数,你可以提供指向/ proc文件工作区的指针。这个指针将被传递给你的读和写功能。

这是非常相似,例如pthread工作,并采取函数指针作为回调许多其他图书馆如何。


如果我没有记错,create_proc_entry已被弃用。

+0

我建议通过我提供的链接查看/ proc的实现。它非常简单,而且信息丰富。实际上,阅读并使用它比阅读不完整的文档或过时的博客文章更容易。 – Shahbaz 2013-04-22 13:33:19

+0

非常感谢,对于接受答案的延误感到抱歉,我最近没有太多时间来玩这个。出于某种原因,即使它正在把我凝视在脸上,“数据”事件完全滑落了我的脑海!再次感谢所有的细节和链接! – zje 2013-04-29 02:49:50

0

看来你正在寻找create_proc_entry功能。它可以在运行时创建一个proc入口。例如,请参阅details