我是靠谱客的博主 顺利背包,最近开发中收集的这篇文章主要介绍kset_create_and_add,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我也是初学,做一些学习笔记,总结到哪里算哪里吧


本文中所有代码都是来自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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部