#include
#include
#include
#include
#include
static int hello_value;
static ssize_t hello_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
return sprintf(buf, "%d\n", hello_value);
}
static ssize_t hello_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
sscanf(buf, "%du", &hello_value);
return count;
}
static struct kobj_attribute hello_value_attribute = __ATTR(hello_value, 0666, hello_show, hello_store);
static struct kobject *hellowold_kobj;
static int __init helloworld_init(void)
{
int retval;
helloworld_kobj = kobject_create_and_add("helloworld", kernel_kobj);
if (!helloworld_kobj)
return -ENOMEM;
retval = sysfs_create_file(helloworld_kobj, &hello_value_attribute);
if (retval)
kobject_put(helloworld_kobj);
return retval;
}
static void __exit helloworld_exit(void)
{
kobject_put(helloworld_kobj);
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHER([email protected]);
一、运行结果:
root@thiz:/sys/kernel/hellowrold# ls
hello_value
root@thiz:/sys/kernel/helloworld# echo 1 > hello_value
root@thiz:/sys/kernel/hellowrold# cat hello_value
1
二、分析
1、目录项(/sys/kernel/helloworld):通过函数kobject_create_and_add("helloworld", kernel_kobj)可以在/sys/kernel下建立一个helloworld目录项。
2、属性文件(hello_value):通过函数sysfs_create_file(helloworld_kobj, &hello_value_attribute)建立。这个也同时建立了文件与操作之间的联系和对应。
3、操作(hello_show、hello_store):在sys系统中对文件的操作有2个函数,一个是show,一个是store,这两个函数和普通文件的read和write函数有点类似,是他们的精简版。对于sprintf和sscanf是对copy_from_user和copy_to_user函数的封装。
4、如果一组属性则可以如下:
static struct attribute *attrs [] = {
&foo_attribute.attr,
&baz_attribuet.attr,
&bar_attribute.attr,
NULL, /* need to NULL terminate the list of attributes */
};
static struct attribute_group attr_group = {
.attrs = attrs,
};
retval = sysfs_create_group(example_kobj, &attr_group);