轉自: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,得到絕對路徑了
————————————————
版權聲明:本文為CSDN博主「nehc」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/cenziboy/article/details/8761621