我正在处理一个项目,需要知道调用系统调用的可执行文件的当前工作目录。我认为这是可能的,因为一些系统调用,如open
将使用该信息。
请问我如何以字符串形式获取当前工作目录路径?
我正在处理一个项目,需要知道调用系统调用的可执行文件的当前工作目录。我认为这是可能的,因为一些系统调用,如open
将使用该信息。
请问我如何以字符串形式获取当前工作目录路径?
可以查看 getcwd
系统调用的实现方式来了解如何做到这一点。
该系统调用位于 fs/dcache.c
中,并调用了:
get_fs_root_and_pwd(current->fs, &root, &pwd);
root
和pwd
是struct path
类型的变量。
该函数定义为内联函数,位于include/linux/fs_struct.h
文件中,该文件还包含:
static inline void get_fs_pwd(struct fs_struct *fs, struct path *pwd)
而这似乎是您想要的。
#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");
如何在终端中执行?您可以使用pwd
命令查看名为PWD
的环境变量。
#include <stdlib.h>
int main(int ac, char **av) {
printf("%s\n", getenv("PWD");
return 0;
}
如果您想知道可执行文件位于哪个目录中,可以结合使用 getenv
和 argv[0]
的信息。