proc_create 和 proc_mkdir 无法处理现有文件,并且 proc_remove 也不会删除它们

问题描述 投票:0回答:1

我正在为课堂作业编写一个 Linux 内核模块,但遇到了一些令人费解的问题。

首先,模块在

/proc/
下创建一个文件夹,并在该文件夹下创建一个文件
/proc/folder/file

实现基本上是这样的:


static struct proc_dir_entry* parent;
static struct proc_dir_entry* file;
// ...
int __init mod_init(void) {
     parent = proc_mkdir("folder", NULL);
     if(parent == NULL) {
         return -ENOMEM;
     }
     file = proc_create("file", 0666, parent, &fops);
     if(file == NULL) {
         return -ENOMEM;
     }
     pr_info("Module insertion successful.\n");
     return 0;
}

现在该模块遇到了几个问题。首先,如果文件/文件夹已经存在,则返回-ENOMEM并指出分配内存失败后无法插入模块。我宁愿能够区分实际上无法创建指向 procfile 的指针,而不是无法覆盖它,我想知道如何做到这一点。

接下来,我删除该模块并尝试删除我制作的文件和文件夹:

void __exit mod_exit(void) {
    proc_remove(file);
    proc_remove(folder);
}
// (And then I bind the insert/exit functions)

现在(假设之前的代码工作正常),这个函数可以正常工作,没有错误。但是,它只删除子文件,并没有删除文件夹,这违背了预期的功能,所以

/proc/
仍然包含
/parent

TL;博士:

  • 如何覆盖现有的 proc 文件并仍然对失败的文件创建进行错误检查?
  • 如何删除 proc 文件夹,我做错了什么?

大多数其他代码都是相当任意的样板代码,它们已经按预期工作,并且主要是针对我的任务的。我只是不知道如何让它工作,因为我在网上找到的任何文档都没有涵盖这个特定的问题(或者谷歌只是不起作用。)

编辑: 我忘了提及,使用 proc_create 和

parent
作为父条目也不起作用,因为 proc_mkdir 返回 NULL。有没有办法简单地获取指向现有文件夹的指针?

我在 Ubuntu 20.04 LTS 上使用内核

6.8.0-48-generic

c linux-kernel procfs
1个回答
0
投票

好吧,事实证明有一个单独的函数

proc_remove_subtree()
专门用于删除 /proc 目录及其子目录,这样就解决了这两个问题。我仍然没有办法区分失败的文件和现有文件,但这消除了检查的需要,因为它们保证在删除模块后被删除。

© www.soinside.com 2019 - 2024. All rights reserved.