首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

proc文件系统操作范例

2012-09-29 
proc文件系统操作实例#include linux/init.h#include linux/module.h#include linux/proc_fs.h#incl

proc文件系统操作实例
#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

#define PROCFS_BUF_MAX_SIZE 32

struct proc_dir_entry *my_proc_dir;
struct proc_dir_entry *my_proc_file;

int test_val = 5;

static int proc_file_read(char *page, char **start, off_t offset,
                int count, int *eof, void *data)
{
        char *p = page;

        sprintf(p,"%d\n", test_val);

        return sizeof(p);
}

static int proc_file_write(struct file *file, const char __user *buffer,
                unsigned long count, void *data)
{
        char procfs_buffer[PROCFS_BUF_MAX_SIZE];
        unsigned long procfs_buffer_size = count;

        if (procfs_buffer_size > PROCFS_BUF_MAX_SIZE) {
                procfs_buffer_size = PROCFS_BUF_MAX_SIZE;
        }

        if (copy_from_user(procfs_buffer, buffer, procfs_buffer_size)) {
                return -EFAULT;
        }

        test_val = simple_strtol(procfs_buffer, NULL, 10);

        return procfs_buffer_size;
}

int create_my_proc_file(void)
{

        int ret = 0;

        my_proc_file = create_proc_entry("my_proc_file", 0666, my_proc_dir);
        if (!my_proc_file) {
                ret = -1;
                return ret;
        }

        /* read, write operation */
        my_proc_file->read_proc = proc_file_read;
        my_proc_file->write_proc = proc_file_write;

        return 0;
}

void remove_my_proc_file(void)
{
        remove_proc_entry("my_proc_file", my_proc_dir);
}

int create_my_proc_dir(void)
{
        int ret = 0;

        my_proc_dir = proc_mkdir("my_proc_dir", NULL);
        if (!my_proc_dir) {
                ret = -1;
                return ret;
        }

        return 0;
}

void remove_my_proc_dir(void)
{
        remove_proc_entry("my_proc_dir", my_proc_dir);
}

static int __init my_module_init(void)
{
        int ret = 0;

        printk(KERN_INFO "Module is now loaded.\n");

        ret = create_my_proc_dir();
        if (ret < 0) {
                goto out;
        }

        ret = create_my_proc_file();
        if (ret < 0) {
                remove_my_proc_dir();
                goto out;
        }

        return 0;
out:
        return ret;
}

static void __exit my_module_cleanup(void)
{
        printk(KERN_INFO "Module is now unloaded.\n");

        remove_my_proc_file();
        remove_my_proc_dir();

        return;
}

module_init(my_module_init);
module_exit(my_module_cleanup);
MODULE_LICENSE("GPL");

热点排行