【问题标题】:Linux Kernel Module - Create DirectoryLinux 内核模块 - 创建目录
【发布时间】:2017-01-25 11:41:43
【问题描述】:

我有一个关于在 linux 内核模块中创建目录的问题。

我想要什么:在内核模块中创建一个目录。

这是我的实际代码:

struct file *fp = (struct file *) NULL;
fp = filp_open("/home/testdir", O_DIRECTORY|O_CREAT, S_IRUSR);

但它会创建一个文件而不是目录。

我尝试在没有标志“O_DIRECTORY”的情况下使用与上面相同的代码:

struct file *fp = (struct file *) NULL;
fp = filp_open("/home/testdir", O_CREAT, S_IRUSR);

而且结果和之前的结果差不多。

我不明白这种行为。我做错了什么?

编辑 1: 我在 Raspberry PI,Raspbian,内核版本上编码:4.4.43-v7

【问题讨论】:

  • 也许O_DIRECTORY 的意思是创建任何父目录,你试过"home/testdir/delete-this" 吗?如果它有效,那么您使用了错误的功能。哦,这只是一个疯狂的猜测。我不知道filp_open() 是什么或做什么。
  • 这不起作用,但感谢您的尝试!它不会创建目录“testdir”或“delete-this”
  • 你为什么不用mkdir()?这个调用应该失败,你不检查返回值吗? "If pathname is not a directory, cause the open to fail."。顺便说一句,这对强制转换 NULL 是没有用的,如果你在之后影响它,那么将你的变量初始化为 NULL 也是没有用的。这是不好的做法。
  • @Stargateur :我使用标志“O_CREAT”来创建目录。手册页说:“如果文件不存在,它将被创建。”。并感谢您为不良做法提供提示!
  • @Stargateur:如何在内核模块中使用“mkdir()”?我需要哪些内容?

标签: c linux linux-kernel kernel-module


【解决方案1】:

我自己弄的。 解决办法是:

struct file *fp = (struct file *) NULL;
fp = filp_open("/home/testdir/", O_DIRECTORY|O_CREAT, S_IRUSR);

注意路径末尾的“/”。

感谢@all 的尝试!

【讨论】:

    【解决方案2】:

    这不会创建目录,但会打开像opendir 这样的目录(该目录应该存在)。

    【讨论】:

    • 所以组合“O_DIRECTORY|O_CREAT”不起作用?
    • 没错,filp_open 的工作方式与 open 一样,但您无法使用 open 创建目录。
    • 我得到了解决方案。 :-)
    猜你喜欢
    • 2015-02-10
    • 2018-11-25
    • 1970-01-01
    • 2019-07-22
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2013-12-17
    相关资源
    最近更新 更多