1
、proc_dir_entry数据结构:
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
module
*
owner
;
struct
proc_dir_entry
*
next
,
*
parent
,
*
subdir
;
void
*
data
;
read_proc_t
*
read_proc
;
write_proc_t
*
write_proc
;
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 */
};
2
、创建函数:
struct
proc_dir_entry
*
create_proc_entry
(
const
char
*
name
,
mode_t mode
,
struct
proc_dir_entry
*
parent
);
name
:
要创建的文件名称;
mode
:
该文件的保护掩码;
parent
:
确定文件所在目录,如果置NULL,则位置为
/
proc
下。
create_proc_entry
的返回值是一个proc_dir_entry指针(或者为NULL,说明在create时发生了错误)
3
、读proc(read_proc函数):
int
mod_read
(
char
*
page
,
char
**
start
,
off_t off
,
int
count
,
int
*
eof
,
void
*
data
);
page
:数据写入到的位置(在内核空间中);
count
:可写入的最大字符数;
start
和off:返回多页数据时使用(通常一页是4kb);
data
:表示指向私有数据的指针;
eof
:文件结束参数。
4
、写proc(write_proc函数):
int
mod_write
(
struct
file
*
filp
,
const
char
__user
*
buff
,
unsigned
long
len
,
void
*
data
);
filp
:实际上是一个打开文件结构(可以忽略这个参数)。
buff
:用户空间要写入的数据。缓冲区地址实际上是一个用户空间的缓冲区,不能直接读取它。
len
:定义了在 buff 中有多少数据要被写入。
data
:参数是一个指向私有数据的指针。
5
.
删除
void
remove_proc_entry
(
const
char
*
name
,
struct
proc_dir_entry
*
parent
);
name
:
要删除的文件名称;
parent
:
确定文件所在目录,如果置NULL,则位置为
/
proc
下。
6
.
实现一个proc文件
实例:
Makefile:
进行编译: