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

xqkwcwgp  于 2023-08-03  发布在  Linux
关注(0)|答案(3)|浏览(112)

我在一个项目中,我需要知道的可执行程序,其中调用系统调用的当前工作目录工作。我认为这是可能的,因为一些系统调用,如open,将利用这些信息。
你能告诉我如何在一个字符串中得到当前的工作目录路径吗?

am46iovg

am46iovg1#

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


这似乎就是你想要的

pepwfjgg

pepwfjgg2#

在较新的内核中,事情发生了一点点变化。您可以使用此命令获取当前工作目录:

#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");

字符串

ykejflvf

ykejflvf3#

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

#include <stdlib.h>

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

    return 0;
}

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

相关问题