步骤:
1、调用create_proc_entry创建一个struct proc_dir_entry结构体
2、对创建的struct proc_dir_entry结构体进行赋值:read_proc 、mode 、size、 write_proc 、read_proc等
注意:(1)、proc文件只有读它的时候才有内容(文件内容动态产生出来,由内核动态产生提供内容)
(2)、普通文件,不读文件,内容也是存在的,静态内容,不是动态内容
[root@localhost proc]# ls
Makefile Module.symvers proc.c proc.ko proc.mod.c proc.mod.o proc.o
[root@localhost proc]# cat proc.c
//#define __KERNEL__
//#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *
buffer,
char **buffer_location,
off_t offset, int buffer_length, int *eof, void *data)
{
int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}
static __init int proc_init()
{
Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",
procfs_name);
return -ENOMEM;
}
Our_Proc_File->read_proc = procfile_read; // 当你“读文件”时候,就跳转到procfile_read函数,然后函数为文件准备内容,内容填到buffer中,buffer在输出给文件
Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
static __exit void proc_exit()
{
remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
module_init(proc_init);
module_exit(proc_exit);
[root@localhost proc]# ls
Makefile Module.symvers proc.c proc.ko proc.mod.c proc.mod.o proc.o
[root@localhost proc]#
insmod proc.ko
[root@localhost proc]# lsmod |grep proc
proc 6020 0
[root@localhost proc]#
cat /proc/proctest
// 加载内核模块后,cat读取文件内容时,读到内核动态产生的内容
HelloWorld!
[root@localhost proc]#
rmmod proc
// 加载内核模块后,cat读取不到文件内容了
[root@localhost proc]#
cat /proc/proctest
cat: /proc/proctest: 没有那个文件或目录
[root@localhost proc]#