背景

在Linux内核中,已知一个进程的pid和其打开文件的文件描述符fd,如何获取该文件的绝对路径?基本思路是先获取该文件在内核中的file结构体,再通过d_path()获取到整个文件的绝对路径。

方法一

如果理解了进程和文件系统数据结构之间的关系,那么这种方法可以采用。基本的方法如下:

1.通过进程pid获取进程描述符task_struct;

2.通过task_struct获取该进程打开文件结构files_struct,从而获取文件描述符表;

3.以fd为索引在文件描述符表中获取对应文件的结构体file;

4.通过file获取对应path结构,该结构封装当前文件对应的dentry和挂载点;

5.通过内核函数d_path()获取该文件的绝对路径;

通过进程pid获取进程描述符demo:

struct task_struct *get_proc(pid_t pid)

{

struct pid *pid_struct = NULL;

struct task_struct *mytask = NULL;

pid_struct = find_get_pid(pid);

if (!pid_struct)

return NULL;

mytask = pid_task(pid_struct, PIDTYPE_PID);

return mytask;

}

通过fd以及d_path()获取绝对路径demo:

int get_path(struct task_struct *mytask, int fd)

{

struct file *myfile = NULL;

struct files_struct *files = NULL;

char path[100] = {'\0'};

char *ppath = path;

files = mytask->files;

if (!files) {

printk("files is null..\n");

return -1;

}

myfile = files->fdt->fd[fd];

if (!myfile) {

printk("myfile is null..\n");

return -1;

}

ppath = d_path(&(myfile->f_path), ppath, 100);

printk("path:%s\n", ppath);

return 0;

}

从上面的代码可以看出,从fd到file结构的获取均通过各个数据结构之间的指向关系获取。

方法二

与方法一的思路相同,但是可以直接使用内核提供的函数fget()进行fd到file的获取。这种方法使用比较简单,程序更加安全,不过就是少了对数据结构关系的思考过程。其实也可以将fget()函数的实现过程作为参考,欣赏内核中代码实现的严谨性。

linux 内核 遍历文件夹,Linux内核中通过文件描述符获取绝对路径相关推荐

  1. r指引到文件夹_R语言中进行文件夹及文件夹内文件操作范例

    rm(list=ls()) path = 'J:/lab/EX29 –在R语言中进行文件(夹)操作' setwd(path) cat("file A\n", file=" ...

  2. linux苹果photodata文件夹,iPhone系统文件夹中的文件及用途

    花了2天时间研究iPhone中锁屏图片和墙纸到底存放在哪个文件夹,最终终于找到是这2个文件: Library/SpringBoard/LockBackground.cpbitmap Library/S ...

  3. win7计算机管理找不到文件夹,win7系统中电脑文件夹选项不见了的具体解决方法...

    最近总会遇见一些用户们在使用win7系统的时候,出现电脑文件夹选项不见了的情况,要怎么处理呢?今日在这里就呈现了win7系统中电脑文件夹选项不见了的具体解决方法. 解决方法一: 1.通过资源管理--- ...

  4. 计算机考试哪个是考试文件夹,计算机考试中考生文件夹下的子文件夹在哪个磁盘中找??...

    满意答案 muxue8228 2015.08.21 采纳率:48%    等级:9 已帮助:517人 子文件夹应该在安装软件的那个磁盘里找.这个子文件夹一般在D盘,文件夹的名称是学生的编号. 在Win ...

  5. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

    linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...

  6. linux find 删除文件夹,linux中find与rm实现查找并删除目录或文件linux操作系统 -电脑资料...

    在linux中find是查找搜索文件而rm是删除文件,下面我们来看一篇linux中find与rm实现查找并删除目录或文件的实例,希望文章对大家会有所帮助, 删除指定目录下指定文件 find 要查找的目 ...

  7. 在linux系统中创建文件夹,Linux系统中创建文件夹命令详解

    Linux系统中创建一个新的文件夹我们可以使用命令来执行,下面由学习啦小编为大家整理了Linux系统中创建文件夹命令详解,希望对大家有帮助! Linux系统中创建文件夹命令详解 一.mkdir命令使用 ...

  8. linux scp 过滤文件夹,linux中使用scp远程拷贝文件及文件夹

    linux中使用scp远程拷贝文件及文件夹 linux scp远程拷贝文件及文件夹,需要的朋友可以参考下 1.拷贝本机/home/wtf/test整个目录至远程主机192.168.100.1的/roo ...

  9. linux下无法删除文件夹,Linux空间中文件或文件夹无法删除的解决办法

    我用的是Linux虚拟空间,每当升级论坛或博客程序后,就会有些旧的文件或文件夹异常"顽固"无法删除,不管是FTP工具还是WEB管理工具都没 辙,只得通知客服协助删除一下.不过总这样 ...

最新文章

  1. Modelsim仿真时不能编译`include文件解决办法
  2. 0004python中的map,reduce,lambda,filter
  3. Python程序设计题解【蓝桥杯官网题库】 DAY12-算法训练
  4. 雇水军刷分有效吗?虚假评论的影响研究分析
  5. java web项目在tomcat中以调试模式运行
  6. 【线段树】扇形面积并(P3997)
  7. 面试稳了!集齐几千名程序员精选的 100 道前端面试题!
  8. 融资13亿后突然死亡!首款产品被苹果点赞,与谷歌竞赛的明星创业公司Anki倒闭...
  9. Python Jquery学习
  10. macOS 12兼容机型列表 想知道你的Mac是否支持macOS Monterey吗?
  11. SSRS 2012 高级图表类型 -- 气泡图与散点图
  12. MySQL(6)-----数据类型
  13. 俄罗斯独立自主的计算机技术和计算机网络
  14. 远程服务器维护工具,免费小工具轻松实现多台服务器维护
  15. java 日程表_递归与分治策略之循环赛日程表Java实现
  16. 蔚来、小鹏、理想自动驾驶能力的纵向演进与横向比较
  17. html页面使用地图,前端PC端使用地图步骤(高德)
  18. extjs6 清除grid中combo列的值
  19. 【电路设计】晶振选择和负载容抗匹配参考指南
  20. 2021-10-30 字典

热门文章

  1. excel在线_Excel太难搞?有了它帮你自动生成,制作高大上图表,用过都说好
  2. HTML5期末大作业:美食介绍网站设计——河南美食介绍(4页) web期末作业设计网页_甜品美食大学生网页设计作业成品
  3. 迅为iTOP-3399开发板快速上手
  4. Ubuntu给clion添加快捷图标
  5. 文件加密打包和解密解包
  6. 小记MAC安装GIT
  7. JQuery Ajax局部刷新功能
  8. <<视觉问答>>2021:Learning Compositional Representation for Few-shot Visual Question Answering
  9. xfce桌面汉化(命令)
  10. 高压空气压缩机怎样选择