《Linux内核编程》第四章:proc文件系统

来源:互联网 发布:java线程并发控制 编辑:程序博客网 时间:2024/06/02 13:31

一、proc的作用

    在Linux系统中,对于内核模块,除了平常的方式,还可以使用特别的方式来向用户进程传递信息——proc文件系统。

    proc文件系统设计的初衷是为了方便地访问进程信息,但是现在该文件系统得到了很大的扩展,它反映了当前运行系统的信息映像,如/proc/meminfo反映了当前内存的使用情况,/proc/modules反映了当前模块的装载情况。

    如:cat /proc/meminfo        cat /proc/cpuinfo        cat /proc/modules

    proc文件系统是对在内存中运行的系统的直接反映,它使用层次式的方式来表示系统。通过proc,我们能够方便地了解内核信息和当前正在运行着的进程的信息。因此,一些shell命令可以很方面地使用这些信息来显示系统当前状况,如ps命令。

二、创建proc文件系统的机制

    创建proc文件的方式和编写驱动程序的方法相似。你至少需要定义两个函数——init_module和cleanup_module(或module_init和module_exit)函数,初始化函数用于创建proc文件并初始化,而退出函数用于清除proc文件并释放申请的内存空间等。

    为了创建一个proc文件,你需要在init_module(或module_init)函数中使用create_proc_entry来创建一个proc文件句柄。该句柄是一个 struct proc_dir_entry类型的指针。然后,你需要设置这个指针的某些函数指针域,这样当用户在应用程序中通过read/write来读写这个proc文件时,就会调用这些指针域的函数来进行具体处理,就如同编写驱动程序中需要设置fops结构体一样。

    结构体struct 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;

        unsigned long size;

        struct inode_operations *proc_iops;

        struct file_operations *proc_fops;

        get_info_t *get_info;

        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;

        int deleted;

        void *set;

      }

    其中read_proc和write_proc是proc接口;通过设置这两个域,那么当我们在用户空间中读该proc文件时,read_proc对应的函数被调用;类似的,当我们在用户空间中写该proc文件时,write_proc对应的函数被调用。