Linux procfs开发指南(部分翻译并做了精简)
Linux Kernel Procfs Guide
Chapter 1. Introduction
/proc文件系统(procfs)在linux内核中是一个特殊的文件系统,是一个虚拟的文件系统,只存在于内存中
注:proc/sys是sysctl文件,不属于procfs
Chapter 2. Managing procfs entries
要使用procfs,需包含#include <linux/proc_fs.h>
1.Creating a regular file
struct proc_dir_entry* create_proc_entry(const char* name,mode_t mode, struct proc_dir_entry* parent);
parent为NULL时,表示文件建立在/proc目录下,失败返回NULL
create_proc_read_entry:创建并初始化一个procfs入口in one single call
2. Creating a symlink
struct proc_dir_entry* proc_symlink(const char* name, struct proc_dir_entry* parent, const char* dest);
在parent目录下创建一个从name到dest的符号链接,像:ln -s dest name
3. Creating a device
struct proc_dir_entry* proc_mknod(const char* name, mode_t mode,struct proc_dir_entry* parent, kdev_t rdev);
创建一个名为name设备文件,mode参数必须包含S_IFBLK或者S_IFCHR,像:mknod --mode=mode name rdev
4. Creating a directory
struct proc_dir_entry* proc_mkdir(const char* name, struct proc_dir_entry* parent);
在parent目录下创建名为name的目录
5.Removing an entry
void remove_proc_entry(const char* name, struct proc_dir_entry* parent);
从procfs中移除parent目录下的name入口。注意它不会递归移除
Chapter 3. Communicating with userland
procfs对文件的读写并不是直接的,而是通过call back函数来操作read_proc and/or write_proc
在create_proc_entry函数返回一个proc_dir_entry* entry,然后设置
entry->read_proc = read_proc_foo;
entry->write_proc = write_proc_foo;
1. Reading data
kernel向用户返回数据
int read_func(char* page, char** start, off_t off, int count,int* eof, void* data);
从start处的off偏移处开始写最多count个字节的内容到page中。
2. Writing data
用户写数据到kernel
int write_func(struct file* file, const char* buffer, unsigned long count, void* data);
从buffer中读count字节,buffer不存在于kernel memory空间,所以需要使用copy_from_user函数,file常NULL
3.A single call back for many files
struct proc_dir_entry* entry;
struct my_file_data *file_data;
file_data = kmalloc(sizeof(struct my_file_data), GFP_KERNEL);
entry->data = file_data;
int foo_read_func(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
int len;
if(data == file_data) {
/* special case for this file */
} else {
/* normal processing */