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

时间:2015-02-13 02:46:27

标签: c linux module kernel posix

我正在为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函数中设置文件结束条件?

2 个答案:

答案 0 :(得分:0)

我认为您现在使用的界面已过时,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来测试此程序。

答案 1 :(得分:0)

我想出了如何做我需要做的事情。 (不一定需要设置EOF指示器,但只需要增加位置,这样cat就无法从我的proc文件中无休止地读取。)

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)

无论如何工作代码示例: 您需要在返回之前增加* 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;
}