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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值