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

    ————————————————
    版权声明:本文为CSDN博主「nehc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/cenziboy/article/details/8761621

  • 相关阅读:
    GuavaCache简介(一)
    四层、七层负载均衡的区别
    腾讯云服务器 Centos6.5 安装 nginx1.12.0
    tomcat8性能优化
    JAVA 正则表达式的三种模式: 贪婪, 勉强和占有的讨论
    java中值传递和引用传递
    架构师书籍
    大型网站架构系列:20本技术书籍推荐
    RabbitMQ
    支付宝付款流程
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/12103109.html
Copyright © 2020-2023  润新知