教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

linux设备模型深探(6)

来源:网络收集 时间:2026-08-05
导读: goto exit; call_usermodehelper(argv[0], argv, env->envp, UMH_WAIT_EXEC); } exit: kfree(devpath); kfree(env); return retval; } 忽略一段选择编译的代码.再后就是调用用户空间的hotplug了.添加最后两个环境变

goto exit;

call_usermodehelper(argv[0], argv, env->envp, UMH_WAIT_EXEC);

} exit:

kfree(devpath);

kfree(env);

return retval; }

忽略一段选择编译的代码.再后就是调用用户空间的hotplug了.添加最后两个环境变量.HOME和PATH.然后调用hotplug.以子系统名称为参数.

现在我们终于知道hotplug处理程序中的参数和环境变量是怎么来的了.^_^

使用完了kset.再调用kset_unregister()将其注销.这个函数很简单,请自行查阅代码.

为了印证一下上面的分析,写一个测试模块。如下:

#include

#include

#include

#include

#include

#include

#include

#include

MODULE_AUTHOR(\

MODULE_LICENSE(\

int kset_filter(struct kset *kset, struct kobject *kobj);

const char *kset_name(struct kset *kset, struct kobject *kobj);

int kset_uevent(struct kset *kset, struct kobject *kobj,

struct kobj_uevent_env *env);

struct kset kset_p;

struct kset kset_c;

struct kset_uevent_ops uevent_ops = {

.filter = kset_filter,

.name = kset_name,

.uevent = kset_uevent, };

int kset_filter(struct kset *kset, struct kobject *kobj) {

printk(\

return 1; }

const char *kset_name(struct kset *kset, struct kobject *kobj) {

static char buf[20];

printk(\

sprintf(buf,\

return buf; }

int kset_uevent(struct kset *kset, struct kobject *kobj,

struct kobj_uevent_env *env) {

int i = 0;

printk(\

while( i< env->envp_idx){

printk(\

i++;

}

return 0; }

int kset_test_init() {

printk(\

kobject_set_name(&kset_p.kobj,\

kset_p.uevent_ops = &uevent_ops;

kset_register(&kset_p);

kobject_set_name(&kset_c.kobj,\

kset_c.kobj.kset = &kset_p;

kset_register(&kset_c);

return 0; }

int kset_test_exit() {

printk(\

kset_unregister(&kset_p);

kset_unregister(&kset_c);

return 0; }

module_init(kset_test_init);

module_exit(kset_test_exit);

在这里,定义并注册了二个kset.第二个kset的kobj->kset域指向第一个kset.这样,当第二个kset注册或者卸载的时候就会调用第一个kset中的uevent_ops的相关操作.

kset_p.uevent_ops->filter函数中,使其返回1.使其匹配成功。

在kset_p.uevent_ops->name中。使其返回的子系统名为引起事件的kobject的名称,即:kset_c.

最后在kset_p.uevent_ops->uevent中将环境变量全部打印出来。

下面是dmesg的输出结果:

kset test init.

UEVENT: filter. kobj kset_c.

UEVENT: name. kobj kset_c.

UEVENT: uevent. kobj kset_c.

ACTION=add.

DEVPATH=/kset_p/kset_c.

SUBSYSTEM=kset_test.

输出结果跟我们的分析是吻合的.

在这里,值得我们注意的是。注册一个kobject不会产生事件,只有注册kset才会.

linux设备模型深探(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/448127.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)