Linux kernel 绝对路径之d_path篇

Posted LiuYanYGZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,,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,得到绝对路径了

 

以上是关于Linux kernel 绝对路径之d_path篇的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令之常用篇

Linux之绝对路径和相对路径

Linux高级命令03:文本搜索命令★ Python Web篇学习汇总:Part 01—Linux基础命令绝对路径和相对路径 / 创建删除复制移动文件及目录命令

Linux高级命令04:查找文件命令★ Python Web篇学习汇总:Part 01—Linux基础命令绝对路径和相对路径 / 创建删除复制移动文件及目录命令

深入浅出Linux内核模块篇 15.1Linux的设备驱动管理之内核对象(Kernel object)机制

深入浅出Linux内核模块篇 15.1Linux的设备驱动管理之内核对象(Kernel object)机制