2

私は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 catorから読み取るtailと、カウンターが1ではなく3ずつ増加するという問題に直面しています。

出力:

cat /proc/proc_test 
counter = 0

cat /proc/proc_test 
counter = 3

cat /proc/proc_test 
counter = 6

私は何が間違っているのですか?

4

3 に答える 3

1

この答えには良いヒントがありますが、私もこの問題を抱えています。理論的に設定*eof = 1することで問題は解決するはずですが、どういうわけか解決しません。

私の修正は、関​​数の上にこれも追加することでした:

if (offset > 0)    // even though I set *eof = 1, the kernel is still calling me, so return 0 for it to stop
    return 0;

上記のコメントは、実際、私が自分のモジュールで書いたものです。

これが行うことは、関数への最初の呼び出し(offset0)のみが何かを実行することを確認することです。

于 2012-09-10T15:12:37.493 に答える