通过inode获取文件名信息

1、当某个进程处理文件时,需要根据文件路径名打开某个文件,然后根据返回值fd完成对文件的操作。如:fd = open("/new/xxx.txt", O_RDWR);参考多进程打开同一个文件问题分析_sydyh43的博客-CSDN博客 。在内核层,最终反映文件的属性是struct inode,一个文件对应着一个strtuct inode。linux下的每一个文件都有对应着一个inode id。

//https://elixir.bootlin.com/linux/latest/source/include/linux/fs.h#L620
struct inode {
	......	unsigned long i_ino        //对应着ls -i显示的id号
	union {
		const unsigned int i_nlink;		//硬链接的个数
		unsigned int __i_nlink;
	};
	......
	union {
		struct hlist_head	i_dentry;		//当前inode挂接dentry的hlist_head。一个文件有多个硬链接,多个文件对应一个inode
		struct rcu_head	i_rcu;
	};
	......
} __randomize_layout;

2、在struct inode 结构体中存在i_nlink成员,对应着硬链接的个数。参考软链接和硬链接_sydyh43的博客-CSDN博客

也就是说同一个inode id会有多个文件名,这么多文件名怎么和inode相关联呢?通过hlist挂接到struct inode中的i_dentry链表中,文件名对应的结构体是struct dentry。

//https://elixir.bootlin.com/linux/latest/source/include/linux/dcache.h#L91
struct dentry {
	......
	struct dentry *d_parent;	/* parent directory */		//上一级的dentry
	......
    struct inode *d_inode;
	unsigned char d_iname[DNAME_INLINE_LEN];	/* small names */	//文件名

	......
	struct list_head d_child;	/* child of parent list */	//上一级指向本级的位置
	struct list_head d_subdirs;	/* our children */		//下一级的dentry
	/*
	 * d_alias and d_rcu can share memory
	 */
	union {
		struct hlist_node d_alias;	/* inode alias list */		//hlist的节点,挂载inode的hlist_head链表中
		struct hlist_bl_node d_in_lookup_hash;	/* only for in-lookup ones */
	 	struct rcu_head d_rcu;
	} d_u;
} __randomize_layout;

其中inode和dentry的结构关系如下,struct dentry中的d_iname就是保存的文件名。

 其中dentry的内部结构关系图如下

 3、当知道inode和dentry的结构关系后,可以通过下面补丁获取文件名

struct inode *inode = NULL;
struct hlist_node *tmp_list = NULL;
struct dentry *s_dentry = NULL;

hlist_for_each(tmp_list, &(inode->i_dentry))		//当inode文件有多个硬链接时,会多次执行
{
    s_dentry = hlist_entry(tmp_list, struct dentry, d_u.d_alias);
    printk("fs name=%s, par name=%s, file name=%s", inode->i_sb->s_id, s_dentry->d_parent->d_iname, s_dentry->d_iname);
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值