日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

kset_create_and_add

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。