sysファイルの1つが変更されたときにモジュールに通知することは可能ですか? 私の仕事は、モジュール内のバッファーのサイズを制御するファイルを作成することです。ファイルの値が変更されたときにバッファーのサイズを変更したいと考えています。私の他のアイデア (モジュールに通知できない場合) は、モジュールが使用されるたびに以前の値を確認してから、バッファーのサイズを変更することでした。
質問する
3641 次
1 に答える
9
これが Sysfs の目的ではないでしょうか。
を作成しkobject
て Sysfs (ディレクトリ) で表現すると、そのオブジェクトの属性が作成され、そのディレクトリ内のファイルになります。store
と へのshow
コールバックを提供しますkobject
。これらは基本的に resp と同等です。write
とread
。
store
あなたがここで欲しいものです。次のようになります。
ssize_t (*store)(struct kobject *kobj, struct attribute *attr,
const char *buffer, size_t size);
仮想ファイルがユーザーランドに書き込まれるとすぐにsize
バイトを受け取ります。buffer
それを行うこのモジュールを見てください(ここから取得):
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/slab.h>
struct my_attr {
struct attribute attr;
int value;
};
static struct my_attr my_first = {
.attr.name="first",
.attr.mode = 0644,
.value = 1,
};
static struct my_attr my_second = {
.attr.name="second",
.attr.mode = 0644,
.value = 2,
};
static struct attribute * myattr[] = {
&my_first.attr,
&my_second.attr,
NULL
};
static ssize_t default_show(struct kobject *kobj, struct attribute *attr,
char *buf)
{
struct my_attr *a = container_of(attr, struct my_attr, attr);
return scnprintf(buf, PAGE_SIZE, "%d\n", a->value);
}
static ssize_t default_store(struct kobject *kobj, struct attribute *attr,
const char *buf, size_t len)
{
struct my_attr *a = container_of(attr, struct my_attr, attr);
sscanf(buf, "%d", &a->value);
return sizeof(int);
}
static struct sysfs_ops myops = {
.show = default_show,
.store = default_store,
};
static struct kobj_type mytype = {
.sysfs_ops = &myops,
.default_attrs = myattr,
};
struct kobject *mykobj;
static int __init sysfsexample_module_init(void)
{
int err = -1;
mykobj = kzalloc(sizeof(*mykobj), GFP_KERNEL);
if (mykobj) {
kobject_init(mykobj, &mytype);
if (kobject_add(mykobj, NULL, "%s", "sysfs_sample")) {
err = -1;
printk("Sysfs creation failed\n");
kobject_put(mykobj);
mykobj = NULL;
}
err = 0;
}
return err;
}
static void __exit sysfsexample_module_exit(void)
{
if (mykobj) {
kobject_put(mykobj);
kfree(mykobj);
}
}
module_init(sysfsexample_module_init);
module_exit(sysfsexample_module_exit);
MODULE_LICENSE("GPL");
また、エントリが読み取られたときにバッファサイズをユーザーに出力したい場合があります。通常はこの方法です。また、情報 (読み取りおよび書き込み) が人間が読める形式であることを確認して、Unix の哲学に遅れずについていくようにしてください。
更新:トップ カーネル開発者の 1 人である Greg Kroah-Hartman によって書かれた、Sysfs ファイルの作成に関する最近の興味深い記事を参照してください。
于 2012-06-16T16:12:29.253 に答える