Linux 3.13 内核模块设置procfile_read文件结束条件

Linux 3.13 Kernel Module set procfile_read end of file condition

我正在为 Linux 3.13 编写内核模块,其中 procfile_read 函数原型定义为:

static ssize_t procfile_read(struct file *file, char __user *buffer, size_t count, loff_t * data)

这与我在网上可以找到的所有资源都不一样,例如 http://linux.die.net/lkmpg/x769.html,Linux 2.x

的函数原型不同

如何在新的 procfile_read 函数中设置文件结束条件?

我认为您现在使用的界面已经过时,this可能会对您有所帮助。

我还有一个/proc文件系统的小例子:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

#include <linux/proc_fs.h>

static int proc_read (char *page, char **start, off_t offset, int count, int *eof, void *data);


static int proc_read (char *page, char **start, off_t offset, int count, int *eof, void *data) {
    int reval = 0;

    reval = sprintf(page, "Hello world\n");
    *eof = 1;

    return reval;
}

static int __init proc_init(void) {
    struct proc_dir_entry * proc_entry;

    printk(KERN_INFO "Hello Proc\n");

    proc_entry = create_proc_read_entry("test_proc", 0, NULL, proc_read, NULL);


    return 0;
}


static void __exit proc_exit(void) {
    remove_proc_entry("test_proc", NULL);

}

module_init(proc_init);
module_exit(proc_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Douglas");

你可以执行cat /proc/test_proc来测试这个程序。

我想出了如何做我需要做的事情。 (并不完全需要设置 EOF 指示器,但只需要增加位置,这样 cat 就不会无休止地从我的 procfile 中读取。)

loff_t *data 参数实际上应该命名为 offset 或 position。 (我认为这更符合它的目的,数据含糊不清)我查看了这个页面的示例定义:http://lxr.free-electrons.com/source/fs/seq_file.c#L165

156 /**
157  *      seq_read -      ->read() method for sequential files.
158  *      @file: the file to read from
159  *      @buf: the buffer to read to
160  *      @size: the maximum number of bytes to read
161  *      @ppos: the current position in the file
162  *
163  *      Ready-made ->f_op->read()
164  */
165 ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)

无论如何工作代码示例: 您需要在 return 之前增加 *data 的值(让用户程序知道它的新位置)。然后你可以在下次调用时检查它是否>0。

static ssize_t proc_read(struct file *file, char __user *buffer, size_t count, loff_t * data){

    if((int)*data>0){
        return 0;
    }

    char * ret_str;
    ret_str= "Test\n";

    *data += 6;
    memcpy(buffer, ret_str, 6);
    return 6;
}