读取内核模块中/ proc条目的函数

时间:2016-06-16 21:28:47

标签: c linux-kernel kernel-module

我正在学习内核编程,我编写了一个小模块来在/proc中创建一个条目,当我在该文件上使用cat时,尝试从中读取内容。代码是:

#define PROC_DIR_NAME "driver/kernel_test_dir"
#define KERNEL_DATA "This is kernel test"

static int proc_entry_open(struct inode *inode, struct file *file) {
    return 0;
}

static int proc_entry_close(struct inode *inode, struct file *file) {
    return 0;
}

// Return temperature thresholds
static ssize_t proc_entry_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {
    ssize_t len = (ssize_t) strlen(KERNEL_DATA);

    if(count > len)
    {
        count = len;
    }

    copy_to_user(buf,KERNEL_DATA,count);

    *ppos += count;
    return count;
}

static struct file_operations fops_proc_entry = {
    .open = proc_entry_open,
    .read = proc_entry_read,
    .release = proc_entry_close,
};

static int __init init_test_kernel(void) {
    proc_dir = proc_mkdir(PROC_DIR_NAME, NULL);
    if(proc_dir == NULL) {
        return -ENOMEM;
    }

    proc_entry_file = proc_create ("kernel_test_file", S_IRUSR, proc_dir,&fops_proc_entry);
    if(!proc_entry_file) {
        return -ENOMEM;
    }

    printk(KERN_INFO "kernel_test: Kernel Test module started\n");
    return 0;
}


// Cleanup module
static void __exit cleanup_test_kernel(void) {
    remove_proc_entry("kernel_test_file", proc_dir);
    remove_proc_entry(PROC_DIR_NAME,NULL);
    printk(KERN_INFO "kernel_test: Kernel Test module stopped\n");
}

module_init(init_test_kernel);
module_exit(cleanup_test_kernel);

当我做sudo cat /proc/driver/kernel_test_dir/kernel_test_file时,控制台上没有显示任何内容。但是,如果我使用rmmod删除模块,控制台会刷新如下字符串:

This is kernel testThis is kernel testThis is kernel testThis is kernel test等。

为什么这样工作?

0 个答案:

没有答案