首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除sysfs条目

删除sysfs条目
EN

Stack Overflow用户
提问于 2015-07-08 10:42:27
回答 1查看 1.9K关注 0票数 0

我正在尝试学习sysfs,并试图编写一个简单的sysfs目录。代码如下所示

代码语言:javascript
复制
static struct kobject *example_kobject;

static int __init mymodule_init (void)
{
    pr_debug("Module initialized successfully \n");
    example_kobject = kobject_create_and_add("kobject_example",
                                             kernel_kobj);
    if(!example_kobject)
            return -ENOMEM;
    return 0;
 }

 static void __exit mymodule_exit (void)
 {
     pr_debug ("Module un initialized successfully \n");
    //  kobject_put(example_kobject); <-- Forgot to delete
 }

 module_init(mymodule_init);
 module_exit(mymodule_exit);

如mymodule_exit所示,我错误地忘记了取消注释代码,然后插入并rmmod了模块。

现在,当我再次尝试插入模块时,初始化失败,因为条目已经存在。

我知道,允许用户空间删除内核创建的条目是没有意义的。但是,我仍然想知道除了重新启动机器之外,是否还有其他方法可以删除特定的/sys/kernel/kobject_example条目。

EN

回答 1

Stack Overflow用户

发布于 2015-07-09 03:14:43

首先,仅仅做kobject_put()是不够的,你必须使用kobject_del()kobject_put()不执行完全清理。在您的例子中,由于put是一个文件(而不是目录),仅仅‘kobject_example’仍然会将条目留在父目录(kset)中。

如果你必须这样做,有一种方法可以在不重启的情况下删除这样的条目,那就是通过编写另一个模块来做到这一点。下面是模块应该做的事情:

代码语言:javascript
复制
/* Find the kobj from the path and parent kset */
kobj = kset_find_obj(kernel_kobj->kset, "kobject_example");
...
/* check kobj is not null etc. */
...
/* Remove the sysfs entry */
kobject_del(kobj);

这将删除sysfs条目。重新启动很容易,但当您的系统没有停止服务的选项时,这是很好的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31282627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档