在内核代码中获取当前工作目录

5

我正在处理一个项目,需要知道调用系统调用的可执行文件的当前工作目录。我认为这是可能的,因为一些系统调用,如open将使用该信息。

请问我如何以字符串形式获取当前工作目录路径?

3个回答

12

可以查看 getcwd 系统调用的实现方式来了解如何做到这一点。

该系统调用位于 fs/dcache.c 中,并调用了:

get_fs_root_and_pwd(current->fs, &root, &pwd);

rootpwdstruct path类型的变量。

该函数定义为内联函数,位于include/linux/fs_struct.h文件中,该文件还包含:

static inline void get_fs_pwd(struct fs_struct *fs, struct path *pwd)

而这似乎是您想要的。


好的,难道没有比这更简单的方法吗?例如一个简单的函数调用,可以将当前工作目录写入一个字符串中吗? - gaurav
不,我正在编写内核代码,实际上我正在对fs/namei.c进行一些更改,所以我需要知道当前的工作目录在哪里?我想我可以调用一些类似sys_getcwd的调用,就像我可以使用sys_getpid来获取pid一样。你能告诉我在哪里可以看到做了什么导出,以便我可以使用那个函数吗?或者我将使用你的答案。 :) - gaurav
我已经得到了结构路径,但如何从中获取字符串形式的路径? - gaurav
请阅读getcwd系统调用代码。它调用一个执行此操作的辅助函数。 - Mat
好的,再次感谢。我认为prepend_path就是那个辅助函数。最后一个问题,我该如何为cwd字符串分配内存?我不认为使用静态数组是个好主意,getcwd从用户空间获取页面,我该如何在内核空间中实现呢? - gaurav
显示剩余12条评论

0
在较新的内核中,事情有了一些变化。您可以使用这个来获取当前工作目录:
#include <linux/init.h>         // module_{init,exit}()
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/dcache.h>       // dentry_path_raw
#include <linux/fs_struct.h>    // get_fs_pwd

static int __init get_cwd_module_init(void)
{
    struct path abs_path;
    char *buf, *full_path;

    buf = __getname();
    if (!buf)
        return -ENOMEM;

    get_fs_pwd(current->fs, &abs_path);

    full_path = dentry_path_raw(abs_path.dentry, buf, PATH_MAX);
    if (IS_ERR(full_path)) {
        pr_err("dentry_path_raw failed: %li", PTR_ERR(full_path));
    } else {
        pr_info("Full path: '%s'", full_path);
    }
    __putname(buf);
    path_put(&abs_path);
}

static void __exit get_cwd_module_exit(void)
{
    pr_info("exiting...");
}

module_init(get_cwd_module_init)
module_exit(get_cwd_module_exit)

MODULE_AUTHOR("garlix");
MODULE_LICENSE("GPL");


-1

如何在终端中执行?您可以使用pwd命令查看名为PWD的环境变量。

#include <stdlib.h>

int main(int ac, char **av) {
    printf("%s\n", getenv("PWD");

    return 0;
}

如果您想知道可执行文件位于哪个目录中,可以结合使用 getenvargv[0] 的信息。


2
抱歉,但我需要在内核代码中获取当前工作目录, 我不能在那里使用这段代码。 - gaurav
@gaurav:好的,我的错,我误解了你的问题。 - Daimrod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接