procfs
注意:适用于2.7-3.7,3.10之后的版本procfs又做了改变,因此编译最后的源码会出现错误。如果编译出现”dereferencing pointer to incomplete type“类似的错误,那就是版本变更了。新版本里用的是file_operation。
说明文档
首先要明白,procfs终究还是fs,也就是属于filesystem的一种。因此可以在内核文档中找到相关资料。如果你手头上有一份内核源码,那么可以根据以下相对路径找到这份说明:
./Documentation/filesystems/proc.txt
直接在网上也可以看到这份文档:
http://lxr.oss.org.cn/source/Documentation/filesystems/proc.txt
API
比较“官方”的procfs的API文档:
http://kernelnewbies.org/Documents/Kernel-Docbooks?action=AttachFile&do=get&target=procfs-guide_2.6.29.pdf
从url中可以看出,这是一份2.6版本内核所写的文档。目前而言,算是最新的了。毕竟2.6和2.4这两个版本之间的差距有点大。http://kernelnewbies.org这个网站里有很多适合Linux新手可以使用的东西,有兴趣可以收藏一下,以后查资料什么的也有个地方。
下面开始对一些关键API的解释,源码可以在以下相对路径中找到:
./kernel/fs/proc/generic.c
1.struct proc_dir_entry* create_proc_entry(const char* name, mode_t mode,struct proc_dir_entry* parent);
@name:创建出的procfs文件的名字
@mode:文件的权限,跟linux文件权限一样,默认为755
@parent:文件的父母节点,为NULL则会直接创建在’/proc‘目录下。可以不为空,详情参考下面一条API
创建一个procfs文件。表现是会在‘/proc’目录下多出一个名为@name的文件
2.struct proc_dir_entry* proc_mkdir(const char* name, struct proc_dir_entry*parent);
@name:文件夹的名字
@parent:父节点,与上面的API一样,可以为空
这个函数创建了一个文件夹,因此如果想在‘/proc’下创建一个文件夹,用于存放自定义的proc文件,则可以调用该函数创建一个文件夹。并将该函数的返回值作为‘create_proc_entry’函数的@parent参数。
3.void remove_proc_entry(const char* name, struct proc_dir_entry* parent);<