概述
我也是初学,做一些学习笔记,总结到哪里算哪里吧
本文中所有代码都是来自linux内核源文件/lib/kobject.c
/**
* kset_create_and_add - 创建一个动态的kset 结构并添加到sysfs中
*
* @name: kset名称
* @uevent_ops: kset的kset_uevent_ops 结构
* @parent_kobj: kset的付kobject,如果有的话
*
* 该方法创建一个动态的kset结构,并注册到sysfs上。用完该结构之后
* 调用kset_unregister() ,该结构将会被动态的释放,之后该结构将不再
* 被使用。
*
* 当无法创建kset,将返回NULL
*/
struct kset *kset_create_and_add(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
struct kset *kset;
int error;
kset = kset_create(name, uevent_ops, parent_kobj);
if (!kset)
return NULL;
error = kset_register(kset);
if (error) {
kfree(kset);
return NULL;
}
return kset;
}
/**
* kset_create - 动态创建kset结构
*
* @name: kset名称
* @uevent_ops: kset的kset_uevent_ops 结构
* @parent_kobj: kset的付kobject,如果有的话
*
* 该方法动态的创建一个kset结构。该结构可以注册到系统中,并在调用
* kset_register()之后再sysfs中显示。使用完该结构之后,如果调用了
* kset_register() ,需要调用kset_unregister(),该结构将动态的释放,并
* 不会被继续使用。
*
* 如果无法创建kset将返回NULL
*/
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
struct kset *kset;
int retval;
kset = kzalloc(sizeof(*kset), GFP_KERNEL);
if (!kset)
return NULL;
retval = kobject_set_name(&kset->kobj, "%s", name);
if (retval) {
kfree(kset);
return NULL;
}
kset->uevent_ops = uevent_ops;
kset->kobj.parent = parent_kobj;
/*
* 当属于该kset的kobject,有一个不属于该kset的kset_ktype
* 类型. 那样,当我们使用完它之后,可以正确的释放。
*/
kset->kobj.ktype = &kset_ktype;
kset->kobj.kset = NULL;
return kset;
}
/**
* kobject_set_name - 设置kobject的名称
* @kobj: 需要设置名称的struct kobject
* @fmt: 构建名称的字符串格式
*
* 这里设置kobject名称. 如果已经将该kobject添加到system中,
* 那么你必须调用kobject_rename()来改变kobject的名称。
*/
int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
{
va_list vargs;
int retval;
va_start(vargs, fmt);
retval = kobject_set_name_vargs(kobj, fmt, vargs);
va_end(vargs);
return retval;
}
/**
* kobject_set_name_vargs - 设置一个kobject的名称
* @kobj: 要设置名称的kobject
* @fmt: 用了构建名称的字符串格式
* @vargs: 构建字符串的参数
*/
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
va_list vargs)
{
const char *old_name = kobj->name;
char *s;
if (kobj->name && !fmt)
return 0;
kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
if (!kobj->name) {
kobj->name = old_name;
return -ENOMEM;
}
/* ewww... some of these buggers have '/' in the name ... 名称中不能用‘/’*/
while ((s = strchr(kobj->name, '/')))
s[0] = '!';
kfree(old_name);
return 0;
}
好吧,关于kvasprintf这里就不再继续挖下去了,猜应该是类似sprintf的一个方法
最后
以上就是顺利背包为你收集整理的kset_create_and_add的全部内容,希望文章能够帮你解决kset_create_and_add所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复