IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Linux内核中通过文件描述符获取绝对路径

edsionte's TechBlog 2014-03-19 22:26:07 累计浏览 3,273 次
本机暂存

背景

在Linux内核中,已知一个进程的pid和其打开文件的文件描述符fd,如何获取该文件的绝对路径。

相关原理

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

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

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

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

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

实现方法

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

1structtask_struct *get_proc(pid_t pid)
2{
3    structpid *pid_struct = NULL;
4    structtask_struct *mytask = NULL;
5
6    pid_struct = find_get_pid(pid);
7    if(!pid_struct)
8        returnNULL;
9    mytask = pid_task(pid_struct, PIDTYPE_PID);
10    returnmytask;
11}

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

1intget_path(structtask_struct *mytask, intfd)
2{
3        structfile *myfile = NULL;
4        structfiles_struct *files = NULL;
5        charpath[100] = {'\0'};
6        char*ppath = path;
7
8        files = mytask->files;
9        if(!files) {
10                printk("files is null..\n");
11                return-1;
12        }
13        myfile = files->fdt->fd[fd];
14        if(!myfile) {
15                printk("myfile is null..\n");
16                return-1;
17        }
18        ppath = d_path(&(myfile->f_path), ppath, 100);
19
20        printk("path:%s\n", ppath);
21        return0;
22}

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,308)
  2. 我的 RHCA 之路 (累计阅读 14,013)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,230)
  4. 给程序员新手的一些建议 (累计阅读 13,089)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  6. 关于linux内存free的一些事情 (累计阅读 12,867)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,688)
  8. Google怎么用linux (累计阅读 12,581)
  9. Linux Used内存到底哪里去了? (累计阅读 11,868)
  10. find命令的一点注意事项 (累计阅读 11,866)