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;
}
我正在为 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; }