摘自: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;structpath base_path;
tpath= (char*)kmalloc(512, 0);if(NULL == tpath || NULL ==task)
{returnNULL;
}
memset(tpath,‘\0‘,512);
task_lock(task);if(task->mm && task->mm->mmap)
{
vma= task->mm->mmap;
}else{
task_unlock(task);
kfree(tpath);returnNULL;
}/** 取得 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);returnret_ptr;
}
三. 获取文件路径
根据文件描述符获取文件路径主要是从task_struct中取得文件的dentry和文件所在文件系统vfsmount
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) base_path= current->files->fdt->fd[fd]->f_path;#elsebase_dp= current->files->fdt->fd[fd]->f_path.dentry;
vfsmnt_ptr= current->files->fdt->fd[fd]->f_path.mnt;
然后就可以使用d_path,得到绝对路径了
原文:https://www.cnblogs.com/LiuYanYGZ/p/12269567.html