Linux内核之最核心数据结构之一:struct file(三十)

news/2024/4/28 2:34:56/文章来源:https://blog.csdn.net/u010164190/article/details/137123056

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Linux内核之最核心数据结构:struct file解析

2.介绍

  • struct file是Linux内核中一个非常重要的结构体,它在文件系统中扮演着桥梁的角色,连接用户空间的应用程序和内核的文件操作。每当用户空间进程打开一个文件时,内核就会创建一个struct file实例来跟踪对该文件的所有操作。
  • struct file的作用主要体现在以下几个方面:
  1. 跟踪文件访问模式struct file中的f_mode字段用来存储文件的用户访问模式,如只读(O_RDONLY)、只写(O_WRONLY)或读写(O_RDWR)。这告诉内核该文件应该以何种方式被访问,以便内核可以进行相应的权限检查和文件状态管理。
  2. 实现随机访问:通过f_pos字段,struct file记录了当前文件的位置,使得进程可以进行随机读写。每次文件操作后,内核会更新这个位置,以便下一次操作可以从这个位置继续。
  3. 版本控制f_version字段用于标识文件的版本,这在多线程环境中非常重要,可以确保一个文件的并发读写操作不会因为不同进程的读写而产生数据不一致的问题。
  4. 存储文件操作f_op字段是一个指向struct file_operations的指针,这个结构体定义了文件的各个操作函数,如读(read)、写(write)、定位(lseek)等。当用户空间进程请求进行文件操作时,内核会调用这些函数来执行具体的操作。
  5. 维护文件引用计数f_count字段用于维护文件描述符的使用计数。每当进程打开一个文件时,计数会增加;当文件被关闭时,计数会减少。这个计数对于确保文件在多个进程间正确共享非常重要。
  6. 进程间通信f_owner字段包含了拥有该文件描述符的进程的PID,这有助于内核确定文件操作的权限,例如,只有拥有者进程才能执行某些特定的文件操作。
  7. 路径名和Dentryf_name字段通常存储文件路径名,而f_dentry字段则指向一个struct dentry,它代表了文件系统中的一个目录项。通过这个目录项,内核可以访问到文件的详细信息,如文件类型、大小、权限等。
  8. 文件锁和同步f_flags字段包含了文件的各种标志,如是否被锁定(FILE_LOCKED)等。这些标志可以帮助内核管理文件的并发访问,确保数据的一致性和完整性。
  9. 私有数据private_data字段允许struct file的实现者存储与特定文件类型相关的私有数据。这为文件操作提供了极大的灵活性,使得内核开发者可以根据不同类型的文件实现特定的行为。
  • 总结来说,struct file结构体是Linux内核文件系统的一个核心组件,它不仅为用户空间进程提供了一个与文件交互的接口,还内核提供了一种方式来跟踪和管理这些交互。通过struct file,内核能够高效地处理文件访问、同步和权限控制等复杂任务,确保了文件系统的稳定性和可靠性。

3.代码实例

<1>.struct file结构体

struct file {union {struct llist_node	fu_llist;struct rcu_head 	fu_rcuhead;} f_u;struct path		f_path;struct inode		*f_inode;	/* cached value */const struct file_operations	*f_op;spinlock_t		f_lock;enum rw_hint		f_write_hint;atomic_long_t		f_count;unsigned int 		f_flags;fmode_t			f_mode;struct mutex		f_pos_lock;loff_t			f_pos;struct fown_struct	f_owner;const struct cred	*f_cred;struct file_ra_state	f_ra;u64			f_version;
#ifdef CONFIG_SECURITYvoid			*f_security;
#endif/* needed for tty driver, and maybe others */void			*private_data;#ifdef CONFIG_EPOLLstruct list_head	f_ep_links;struct list_head	f_tfile_llink;
#endif /* #ifdef CONFIG_EPOLL */struct address_space	*f_mapping;errseq_t		f_wb_err;
} 

<2>.struct file结构体每个字段注释

1.f_u:
一个联合体,用于表示文件使用的数据结构。可以根据不同的使用方式选择存储在 fu_llist 中或者 fu_rcuhead 中。2.fu_llist:
用于将文件链接到文件系统的文件使用链表中。3.fu_rcuhead:
用于在文件引用计数为零时释放文件资源。4.f_path:
表示文件的路径信息,包括目录项和 dentry 项。5.f_inode:
指向文件的 inode 结构体,用于表示文件在文件系统中的详细信息。这是一个缓存值,可以用于快速访问文件的 inode。6.f_op:
指向文件的操作函数表,包含了文件操作的函数指针。7.f_lock:
自旋锁,用于保护与文件相关的链接列表和标志位。在非中断上下文中使用。8.f_write_hint:
用于存储对文件的写入操作的提示,用于优化写入操作。9.f_count:
原子长整型,表示文件的引用计数。10.f_flags:
存储文件的标志位,用于表示文件的打开模式和属性。11.f_mode:
存储文件的打开模式,用于表示文件的访问权限。12.f_pos_lock:
互斥锁,用于保护文件的位置信息。13.f_pos:
文件的当前读/写位置。14.f_owner:
用于存储文件的所有者信息。15.f_cred:
指向与文件关联的安全凭证信息。16.f_ra:
与文件相关的读取加速信息。17.f_version:
文件的版本号。18.f_security:
与文件相关的安全信息,若配置了安全模块则存在,否则为空。19.private_data:
用于存储文件的私有数据,由文件操作函数使用。20.f_ep_links:
用于在 epoll 事件轮询机制中链接所有与此文件相关的 hooks。21.f_tfile_llink:
用于链接到 tracefs 文件系统的跟踪文件。22.f_mapping:23.指向文件的地址空间对象,表示文件的数据存储方式。24f_wb_err:
文件的写入错误信息。25. __randomize_layout 和 __attribute__((aligned(4))) 
是对结构体布局和对齐的优化选项。

<3>.struct rcu_head结构体定义:用于在文件引用计数为零时释放文件资源。

struct callback_head {struct callback_head *next;void (*func)(struct callback_head *head);
} __attribute__((aligned(sizeof(void *))));#define rcu_head callback_head

定义回调函数

<4>.struct path结构体定义:表示文件的路径信息,包括目录项和 dentry 项。

private/msm-google/include/linux/path.h

struct path {struct vfsmount *mnt;struct dentry *dentry;
} __randomize_layout;

struct vfsmount结构体

struct vfsmount {struct dentry *mnt_root;	/* root of the mounted tree */struct super_block *mnt_sb;	/* pointer to superblock */int mnt_flags;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);void *data;
} __randomize_layout;

struct dentry结构体

struct dentry {/* RCU lookup touched fields */unsigned int d_flags;		/* protected by d_lock */seqcount_t d_seq;		/* per dentry seqlock */struct hlist_bl_node d_hash;	/* lookup hash list */struct dentry *d_parent;	/* parent directory */struct qstr d_name;struct inode *d_inode;		/* Where the name belongs to - NULL is* negative */unsigned char d_iname[DNAME_INLINE_LEN];	/* small names *//* Ref lookup also touches following */struct lockref d_lockref;	/* per-dentry lock and refcount */const struct dentry_operations *d_op;struct super_block *d_sb;	/* The root of the dentry tree */unsigned long d_time;		/* used by d_revalidate */void *d_fsdata;			/* fs-specific data */union {struct list_head d_lru;		/* LRU list */wait_queue_head_t *d_wait;	/* in-lookup ones only */};struct list_head d_child;	/* child of parent list */struct list_head d_subdirs;	/* our children *//** d_alias and d_rcu can share memory*/union {struct hlist_node d_alias;	/* inode alias list */struct hlist_bl_node d_in_lookup_hash;	/* only for in-lookup ones */struct rcu_head d_rcu;} d_u;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);
} __randomize_layout;

<5>.const struct file_operations结构体定义:指向文件的操作函数表,包含了文件操作的函数指针。

struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);int (*iterate) (struct file *, struct dir_context *);int (*iterate_shared) (struct file *, struct dir_context *);__poll_t (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);unsigned long mmap_supported_flags;int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, loff_t, loff_t, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*flock) (struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **, void **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMUunsigned (*mmap_capabilities)(struct file *);
#endifssize_t (*copy_file_range)(struct file *, loff_t, struct file *,loff_t, size_t, unsigned int);int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,u64);int (*dedupe_file_range)(struct file *, loff_t, struct file *, loff_t,u64);int (*fadvise)(struct file *, loff_t, loff_t, int);ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);
} __randomize_layout;

文件操作的回调函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027385.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu编译OpenCV and seetaFace2

opencv opencv-4.5.2 opencv_contrib-4.5.2 SeetaFace2 SeetaFace2-master https://github.com/seetafaceengine 指定安装目录&#xff0c;和OpenCV放一个目录下了 安装前 安装 安装后 Qt安装 Windows下 Linux下 报错1 原因&#xff1a; 报错…

Linux指令大全,第二篇(超详细版)

目录 9.1 链接文件的命令 10.1. 用户和权限 11.1 文件压缩和解压命令 12.1 文件操作命令补充 13.1 Vim编辑器的使用 14.1 Linux开关机命令 15.1 Shell Linux 程序设计&#xff08;未完持续更新~&#xff09; 16.1 以上运行效果图如下 9.1 链接文件的命令 9.1.1 …

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异

引言 随着互联网的快速发展&#xff0c;信息的获取变得比以往任何时候都更加便捷。在数字化时代&#xff0c;人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息&#xff0c;然而&#xff0c;这种机械式的检索方式有时候并不…

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]

由于最近在整理单目测距的内容&#xff0c;顺手也总结下鱼眼相机的测距流程和误差分析&#xff0c;如果有错误&#xff0c;还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正&#xff08;完整版&#xff09; 相机模型总结&#xff08;针孔、鱼眼、全景&#xff09; 三维…

机器人是怎么计时的(通用定时器 - 时基单元)

目录 一&#xff0c;引言 二&#xff0c;机器人的“大脑” 三&#xff0c;时基单元介绍 1&#xff0c;定时器框图 2&#xff0c;时基单元 &#xff08;1&#xff09;预分频器 &#xff08;2&#xff09;CNT计数器 &#xff08;3&#xff09;自动重装载寄存器 四&#…

智慧管道物联网远程监控解决方案

智慧管道物联网远程监控解决方案 智慧管道物联网远程监控解决方案是近年来在智能化城市建设和工业4.0背景下&#xff0c;针对各类管道网络进行高效、安全、精准管理的前沿科技应用。它融合了物联网技术、大数据分析、云计算以及人工智能等多种先进技术手段&#xff0c;实现对管…

【MATLAB源码-第171期】基于matlab的布谷鸟优化算法(COA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 布谷鸟优化算法&#xff08;Cuckoo Optimization Algorithm, COA&#xff09;是一种启发式搜索算法&#xff0c;其设计灵感源自于布谷鸟的独特生活习性&#xff0c;尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中…

Java Spring创建bean流程及自定义构造方法示例

一、spring容器创建bean的简单步骤 1、扫描被Service&#xff0c;Component等注解标识的类。 2、找到类的构造方法 默认使用无参构造方法构建bean&#xff0c;如果类中定义了有参构造方法则会按照有参构造方法构建bean。 3、依赖注入 如果类中存在Autowired或有参的构造方法&am…

如何使用PHP和RabbitMQ实现延迟队列(方式二)?

前言 前几天写了一篇关于PHP和RabbitMQ如何通过插件实现延迟队列的功能。 今天写另外一篇不需要插件的方式&#xff0c;使用RabbitMQ的死信队列&#xff08;Dead-Letter-Exchanges, DLX&#xff09;和消息TTL&#xff08;Time-To-Live&#xff09;。 这种方法涉及到设置消息…

记一次 .NET某防伪验证系统 崩溃分析

一&#xff1a;背景 1. 讲故事 昨晚给训练营里面的一位朋友分析了一个程序崩溃的故障&#xff0c;因为看小伙子昨天在群里问了一天也没搞定&#xff0c;干脆自己亲自上阵吧&#xff0c;抓取的dump也是我极力推荐的用 procdump 注册 AEDebug 的方式&#xff0c;省去了很多沟通…

[flink] flink macm1pro 快速使用从零到一

文章目录 快速使用 快速使用 打开 https://flink.apache.org/downloads/ 下载 flink 因为书籍介绍的是 1.12版本的&#xff0c;为避免不必要的问题&#xff0c;下载相同版本 解压 tar -xzvf flink-1.11.2-bin-scala_2.11.tgz启动 flink ./bin/start-cluster.sh打开 flink web…

RTOS线程切换的过程和原理

0 前言 RTOS中最重要的一个概念就是线程&#xff0c;线程的按需切换能够满足RTOS的实时性要求&#xff0c;同时能将复杂的需求分解成一个个线程执行减轻我们开发负担。 本文从栈的角度出发&#xff0c;详细介绍RTOS线程切换的过程和原理。 注&#xff1a;本文参考的RTOS是RT-T…

<QT基础(5)>事件监听

事件监听 事件监听&#xff08;Event Handling&#xff09;是在程序中监视和响应发生的事件的一种机制。在Qt中&#xff0c;事件监听是一种常见的用于处理用户输入、系统事件以及其他类型事件的方法。通过事件监听&#xff0c;您可以在发生特定事件时捕获事件并执行相应的操作…

【AI】在本地 Docker 环境中搭建使用 Hugging Face 托管的 Llama 模型

目录 Hugging Face 和 LLMs 简介利用 Docker 进行 ML格式的类型请求 Llama 模型访问创建 Hugging Face 令牌设置 Docker 环境快速演示访问页面入门克隆项目构建镜像运行容器结论推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战Hugging Fa…

7、鸿蒙学习-共享包概述

HarmonyOS提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;Harmony Shared Package&#xff09;动态共享包。 HAR与HSR都是为了实现代码和资源的共享&#xff0c;都可以包含代码、C库、资源和配置文件&#xf…

iPhone用GPT替代Siri

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 前一段时间&#xff0c;因为iCloud协议的更新&#xff0c;我的云盘空间无法正常…

RISC-V特权架构 - 中断定义

RISC-V特权架构 - 中断定义 1 中断类型1.1 外部中断1.2 计时器中断1.3 软件中断1.4 调试中断 2 中断屏蔽3 中断等待4 中断优先级与仲裁5 中断嵌套6 异常相关寄存器 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断类型 RISC-V 架构定义的中…

helm 部署 Kube-Prometheus + Grafana + 钉钉告警部署 Kube-Prometheus

背景 角色IPK8S 版本容器运行时k8s-master-1172.16.16.108v1.24.1containerd://1.6.8k8s-node-1172.16.16.109v1.24.1containerd://1.6.8k8s-node-2172.16.16.110v1.24.1containerd://1.6.8 安装 kube-prometheus mkdir -p /data/yaml/kube-prometheus/prometheus &&…

CDH集群hive初始化元数据库失败

oracle数据库操作&#xff1a; 报错如下&#xff1a;命令 (Validate Hive Metastore schema (237)) 已失败 截图如下&#xff1a; 后台日志部分摘录&#xff1a; WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…