proc文件系统的简单使用

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

猜你喜欢

转载自blog.csdn.net/weixin_39821531/article/details/88555322