|
1、struct proc_dir_entry 结构体是用来管理/proc文件系统目录项,其成员有:
struct proc_dir_entry {
unsigned int low_ino;
unsigned short namelen;
const char *name;
mode_t mode;
nlink_t nlink;
uid_t uid;
gid_t gid;
loff_t size;
const struct inode_operations *proc_iops;
/*
* NULL ->proc_fops means "PDE is going away RSN" or
* "PDE is just created". In either case, e.g. ->read_proc won't be
* called because it's too late or too early, respectively.
*
* If you're allocating ->proc_fops dynamically, save a pointer
* somewhere.
*/
const struct file_operations *proc_fops;
struct proc_dir_entry *next, *parent, *subdir;
void *data;
read_proc_t *read_proc; // file read function
write_proc_t *write_proc; //file write function
atomic_t count; /* use count */
int pde_users; /* number of callers into module in progress */
spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
struct completion *pde_unload_completion;
struct list_head pde_openers; /* who did ->open, but not ->release */
};
为了创建可读可写的proc文件并指定该proc文件的读写操作函数,必须设置这些创建proc文件的函数返回指针指向的struct proc_dir_entry结构的write_proc字段,并指定该proc文件的访问权限有写权限,如上例.这样用户就可通过cat 和 echo命令来查看文件的内容和向文件写数据.
struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode,struct proc_dir_entry *parent );
作用:该函数用于在/proc文件系统中创建一个虚拟文件(proc条目)。
参数:
name: 给出要创建的文件名称;
mode:给出建立的该proc文件的访问权限;
parent:指定建立的proc文件所在的目录;
如果要在/proc根目录下建立proc文件,parent应当为NULL
若返回NULL,说明create出错
remove_proc_entry函数原型:
void remove_proc_entry( const char *name, struct proc_dir_entry *parent );
作用:用于删除创建的proc文件。
参数:
name:给出要删除的proc文件的名称;
parent:指定创建的proc文件所在的目录。
parent参数可以是NULL(指/proc根目录),也可以取其他值,这取决于我们创建时将这个文件放到了什么地方。可以使用的其他一些值 proc_dir_entry:proc_root_fs、proc_net、proc_bus、proc_root_driver等。这些取值在linux/proc_fs.h中引入,如下:
extern struct proc_dir_entry proc_root; (/proc目录)
extern struct proc_dir_entry *proc_root_fs; (/proc/fs目录)
extern struct proc_dir_entry *proc_net; (/proc/net)
extern struct proc_dir_entry *proc_bus; (/proc/bus)
extern struct proc_dir_entry *proc_root_driver; (/proc/driver)
extern struct proc_dir_entry *proc_root_kcore; (/proc/kcore)
注意:上面的定义中,proc_root和其他变量的类型不同,其他的都是指针,在使用时要注意。利用这些位置值,我们可在/proc文件系统的根目录(/proc)及其内部的目录下(如/proc/net、/proc/bus等)建立文件。除此之外,我们还可以用自己创建的目录(proc_mkdir)。
3、/proc文件写函数: 我们可以使用write_proc函数向/proc中写入一项。此函数原型:
int mod_write( struct file *filp, const char __user *buff, unsigned long len, void *data );
参数: filp 参数实际上是一个打开文件结构;
buff 参数是存放在缓冲区的要写入的字符串数据;
len 参数定义了在 buff 中有多少数据要被写入;
data 参数是一个指向私有数据的指针(proc_dir_entry中)。
注意:缓冲区buff地址实际上是一个用户空间的缓冲区,因此我们不能直接读取它,一般使用 copy_from_user 函数来维护用户空间的数据
/proc文件读函数:
我们可以使用read_proc函数从一个/proc项中读取数据(从内核空间到用户空间)。此函数原型:
int mod_read( char *page, char **start, off_t off, int count, int *eof, void *data );
参数:page 参数是这些数据写入到的位置;
count 定义了可以写入的最大字符数;
在返回多页数据(通常一页是 4KB)时,我们需要使用 start 和 off 参数;
当所有数据全部写入之后,就需要设置 eof(文件结束参数);
与 write 类似,data 表示的也是私有数据。
注意:此处提供的page缓冲区在内核空间中,因此我们可以直接读出,而不用调用copy_to_user。
mode:给出建立的该proc文件的访问权限;
parent:指定建立的proc文件所在的目录;
如果要在/proc根目录下建立proc文件,parent应当为NULL
若返回NULL,说明create出错
void remove_proc_entry( const char *name, struct proc_dir_entry *parent );
作用:用于删除创建的proc文件。
参数:
name:给出要删除的proc文件的名称;
parent:指定创建的proc文件所在的目录。