Linux kernel 绝对路径之d_path篇
摘自:https://blog.csdn.net/cenziboy/article/details/8761621
一. d_path函数说明
d_path 是内核提供的根据dentry和vfsmount获取绝对路径函数
此函数有2个版本,以内核版本2.6.25为分界
extern char *d_path(const struct path *, char *, int);
extern char * d_path(struct dentry *, struct vfsmount *, char *, int);
结构体path原型如下
struct path {
struct vfsmount *mnt;
struct dentry *dentry;
};
仅仅是对 vfsmount 和 dentry进行了简单封装而已
二.获取进程路径
char* get_absolute_path(struct task_struct * task) { char * ret_ptr = NULL; char * tpath = NULL ; struct vm_area_struct * vma = NULL; struct path base_path; tpath = (char*)kmalloc(512, 0); if(NULL == tpath || NULL == task) { return NULL; } memset(tpath,'\0',512); task_lock(task); if(task->mm && task->mm->mmap) { vma = task->mm->mmap; } else { task_unlock(task); kfree(tpath); return NULL; } /* * 取得 path(a struct含dentry和vfsmount),参考自 fs/proc/base.c中proc_exe_link */ while(vma) { if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file) { base_path = vma->vm_file->f_path; break; } vma = vma->vm_next; } task_unlock(task); /* * 调用 d_path, 得到绝对路径 */ ret_ptr = d_path(&base_path, tpath, 512); return ret_ptr; }
三. 获取文件路径
根据文件描述符获取文件路径主要是从task_struct中取得文件的dentry和文件所在文件系统vfsmount
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) base_path = current->files->fdt->fd[fd]->f_path; #else base_dp = current->files->fdt->fd[fd]->f_path.dentry; vfsmnt_ptr = current->files->fdt->fd[fd]->f_path.mnt;
然后就可以使用d_path,得到绝对路径了
标签:
内核
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)