proc文件系统是一种特殊的、由软件创建的文件系统,内核使用它向外界导出信息,/proc下面的每个文件都绑定一个内核函数,用户读取其中的文件时,该函数动态地生成文件的“内容”。例如,/proc/modules列出的是当前载入模块的列表。
在Linux系统中,对/proc的使用很频繁。现代Linux发行版本中的很多工具都是通过/proc来获取它们需要的信息,例如ps、top和uptime。有些设备驱动程序也通过/proc导出信息,而我们自己的驱动程序当然也可以这么做。因为/proc文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的入口项。
/proc入口不单单是可以读取的,同时也可以写入数据。当然之前提到的sysfs也可以完成类似的功能(向外界导出信息)。
和proc相关的函数都定义在:kernel-4.9/include/linux/proc_fs.h
数据项:
struct proc_dir_entry结果可以用来表示proc系统中的一个文件夹或者文件。
创建文件夹:
static inline struct proc_dir_entry *proc_mkdir(const char *name,
struct proc_dir_entry *parent) {return NULL;}
name:表示名字
parent:表示父文件夹,当为NULL时候表示在/proc根目录
创建文件:
static inline struct proc_dir_entry *proc_create(
const char *name, umode_t mode, struct proc_dir_entry *parent,
const struct file_operations *proc_fops)
{
return proc_create_data(name, mode, parent, proc_fops, NULL);
}
name:表示名字
mode:模式,从目前版本看,它实际是个短整型,赋值个0664差不多项目中够用了。
parent:表示父文件夹,当为NULL时候表示在/proc根目录
proc_fops:这是对应的操作函数指针集。
移除:
extern void remove_proc_entry(const char *, struct proc_dir_entry *);
第一个参数是要移除的文件名;
第二个参数是文件所在的文件夹,如果在/proc根目录,参数为NULL;
读写:
static ssize_t my_proc_write(struct file *file, const char *buffer, size_t count, loff_t *data);
static ssize_t my_proc_read(struct file *file, char __user *buffer, size_t count, loff_t *data);
struct file_operations proc_fops =
{
.read=my_proc_read,
.write=my_proc_write,
.owner=THIS_MODULE,
};
file_operations在早前已经提到过了,实现其中的read和write函数即可。
传送门:file_operations
https://blog.csdn.net/weixin_39821531/article/details/86582838