proc文件系统实验---入门经典

步骤:

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  

#include  
#include
#include /* 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]# 

你可能感兴趣的:(linux内核)