加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux内核函数目录,Linux kernel 绝对路径之d_path篇

发布时间:2023-01-14 09:33:12 所属栏目:Linux 来源:未知
导读: 一. d_path函数说明
d_path 是内核提供的根据dentry和vfsmount获取绝对路径函数
此函数有2个版本,以内核版本2.6.25为分界
extern char *d_path(const struct path *, char *, int);
exter

一. 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_pathlinux 路径,得到绝对路径了

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!