【问题标题】:Getting current working directory within kernel code在内核代码中获取当前工作目录
【发布时间】:2012-01-12 02:04:19
【问题描述】:

我正在做一个项目,我需要知道调用系统调用的可执行文件的当前工作目录。我认为这是可能的,因为像open 这样的一些系统调用会利用这些信息。

您能告诉我如何在字符串中获取当前工作目录路径吗?

【问题讨论】:

    标签: linux directory linux-kernel


    【解决方案1】:

    您可以查看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)
    

    这似乎就是你所追求的。

    【讨论】:

    • 好的,没有比这更简单的方法了吗,比如可以将当前工作目录写入字符串的简单函数调用?
    • 这是一个简单的函数调用来获取struct path。我是否误解了你的问题,而你实际上并没有编写内核代码?
    • 不,我正在编写内核代码,实际上我正在 fs/namei.c 中进行一些更改,所以我需要知道那里的当前工作目录?我想我可以调用一些 sys_getcwd 类型的调用,就像我可以使用 sys_getpid 来获取 pid 一样。你能告诉我在哪里可以看到完成了哪些导出以便我可以使用该功能吗?或者我会用你的答案。 :)
    • sys_getcwd 需要一个指向用户内存的指针来存储路径(使用 copy_to_user)。如果您在内核空间中,那是不合适的。在 dcache.c 中阅读该函数以了解它是如何工作的,或者在代码中查找 get_fs_pwd 的其他用法。
    • 好的,我明白了。非常感谢您的帮助。另外我需要知道调用这个系统调用的可执行文件的完整名称我可以得到吗?
    【解决方案2】:

    你如何在终端中做到这一点?您使用pwd 查看名为PWD 的环境变量。

    #include <stdlib.h>
    
    int main(int ac, char **av) {
        printf("%s\n", getenv("PWD");
    
        return 0;
    }
    

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

    【讨论】:

    • 抱歉,我需要在内核代码中获取当前工作目录,我不能在那里使用此代码。
    • @gaurav:好吧,我的错,我误解了你的问题。
    猜你喜欢
    • 2020-05-17
    • 2020-06-03
    • 1970-01-01
    • 2012-07-22
    • 2010-09-18
    • 1970-01-01
    • 2012-04-12
    • 2011-06-19
    • 2021-01-18
    相关资源
    最近更新 更多