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