我正在研究一个linux内核,所以我尝试编写一个简单的模块。
以下代码应该控制调用read()
的次数:/proc/proc_test
#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/kernel.h>
#include <asm/current.h>
static int __init init(void);
static void __exit stop(void);
static int proc_read(char *buffer, char **start, off_t offset, int size, int *eof, void *data);
static int counter = 0;
static int proc_read(char *buffer, char **start, off_t offset, int size, int *eof, void *data) {
if (size < 256) return -ENOMEM;
return sprintf(buffer, "counter = %d\n", counter++); <-- supposed to be incremented once
}
static int __init init() {
if (create_proc_read_entry("proc_test", 0, NULL, proc_read, NULL) == 0) {
printk(KERN_ERR "Can not creat entry\n");
return -ENOMEM;
}
printk("Entry created!\n");
return 0;
}
static void __exit stop() {
remove_proc_entry("proc_test", NULL);
printk("Entry removed!\n");
return;
}
module_init(init);
module_exit(stop);
MODULE_LICENSE("GPL");
我面临的问题是,当我从/proc/proc_test/
using cat
or读取时tail
,计数器增加 3 而不是 1。
输出:
cat /proc/proc_test
counter = 0
cat /proc/proc_test
counter = 3
cat /proc/proc_test
counter = 6
我究竟做错了什么?