【问题标题】:How to get the "file name" from struct file* in the kernel?如何从内核中的 struct file* 获取“文件名”?
【发布时间】:2013-06-18 16:55:20
【问题描述】:

我想知道在/sys/* 中的哪个文件上调用了函数static ssize_t sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos)。问题是如何通过struct file *file 获取文件名/路径?

struct file {
  mode_t f_mode;
  loff_t f_pos;
  unsigned short f_flags;
  unsigned short f_count;
  unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;
  struct file *f_next, *f_prev;
  int f_owner;         /* pid or -pgrp where SIGIO should be sent */
  struct inode * f_inode;
  struct file_operations * f_op;
  unsigned long f_version;
  void *private_data;  /* needed for tty driver, and maybe others */
};

编辑: 我知道 inode 与名称之间没有一对一的映射,但我必须知道主要/次要/文件描述符,并且可以在文件系统中搜索一些 inode 的名称。

【问题讨论】:

  • 你需要这个名字做什么?

标签: c linux linux-kernel


【解决方案1】:

实际上,您可以检索用于打开文件的文件路径。在 linux 中,struct file 代表一个打开的文件,并且具有用于打开该文件的路径与该结构相关联。在 2.6.20 之前,它是一个名为 f_dentry 的成员,而从 2.6.20 开始,它是一个名为 f_path 的新成员。您可以使用函数 d_path() 直接检索文件的完整路径。

参考以下Linux源码:

http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.10#L763

http://lxr.free-electrons.com/source/fs/dcache.c?v=3.0#L2626

并且还回答: How can I get a filename from a file descriptor inside a kernel module?

【讨论】:

  • 实际代码将取决于您使用的内核版本,因为 struct file 和 d_path() 都随着时间而改变。您可以将另一个问题中的代码作为参考 - 只需忽略获取指向结构文件的指针的部分,因为您已经拥有它。
【解决方案2】:

在 Linux 和其他类 Unix 操作系统中,文件对象可以由任意数量的名称指向,并且文件对象本身没有指向其中任何名称的指针。名称不是文件的特征,它们只是一个外部索引。

【讨论】:

  • 如果是设备,我可以得到文件的主要和次要文件吗?如何从文件指针映射回文件系统中的路径?
  • 文件指针有一个指向inode的指针,其中包含设备号等数据。但是您错过了重点:打开的文件没有名称。您可能已经使用了它的一个名称来获取它,但这基本上是一种单向操作。
  • 我没有错过重点,但我的问题是如何从指针映射回文件系统上的文件,这似乎是可能的。
  • 你为什么认为这是可能的?可能有 20 个或更多名称映射到同一个文件,或者没有。
  • 因为如果我知道小调和大调并且我知道我会在 /sys/bla/specific-bla/very-specific/ 下寻找一个名称,如果它没有符号则必须是唯一的.
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 2012-01-05
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2011-02-05
相关资源
最近更新 更多