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

简介: 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.rhkb.cn/news/289846.html

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

相关文章

使用脚本自动同步时间(在 Windows 7/8/10/11 中)

你可以使用使用 w32tm 命令的批处理脚本来同步 Windows上的时间。 这是一个用于同步时间的简单批处理脚本&#xff1a; echo off echo 正在同步时间... w32tm /resync echo 时间同步完成。将以上代码保存在扩展名为.bat的文本文件中&#xff0c;例如sync_time.bat。 然后&…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深&#xff0c;制药行业作为国民经济的重要支柱之一&#xff0c;也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来&#xff0c;制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

Svg Flow Editor 原生svg流程图编辑器(四)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类&#xff0c;其中一类是以FlinkDoris为核心的实时数仓架构方案&#xff1b;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍&#xff0c;这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…

LockSupport与线程中断机制

中断机制是个协商机制 Interrupt(): 将中断状态设置为true Interrupted():&#xff08;静态方法&#xff09; 1.返回当前线程的中断状态 2.将中断状态清零并设置为false is Interrupted(): 判断当前线程是否被中断 如何停止中断运行中的线程&#xff1f; 一个线程不应该由…

电脑关机速度很慢怎么解决?

给电脑关机&#xff0c;总是要很久才完全关闭。这是因为计算机运行了太长时间&#xff0c;并且打开的程序太多&#xff0c;则关闭时间超过十秒钟&#xff0c;这是正常的现象。还有就是计算机升级或补丁程序更新也将导致计算机缓慢关闭。此时&#xff0c;建议耐心等待关闭完成。…

Redis、Mysql双写情况下,如何保证数据一致

Redis、Mysql双写情况下&#xff0c;如何保证数据一致 场景谈谈数据一致性三个经典的缓存模式Cache-Aside Pattern读流程写流程 Read-Through/Write-Through&#xff08;读写穿透&#xff09;Write behind &#xff08;异步缓存写入&#xff09; 操作缓存的时候&#xff0c;删除…

实现DevOps需要什么?

实现DevOps需要什么&#xff1f; 硬性要求&#xff1a;工具上的准备 上文提到了工具链的打通&#xff0c;那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下&#xff1a; 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubV…

探索智慧农业精准除草,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道&#xff0c;随着科技的普及与落地应用&#xff0c;会有更加广阔的发展空间&#xff0c;关于农田作物场景下的项目开发实践&#xff0c;在我们前面的博文中也有很堵相关的实践&#xff0c;单大都是偏向于目标检测方向的&#xff0c;感兴趣可以自行…

百度智能云千帆,产业创新新引擎

本文整理自 3 月 21 日百度副总裁谢广军的主题演讲《百度智能云千帆&#xff0c;产业创新新引擎》。 各位领导、来宾、媒体朋友们&#xff0c;大家上午好。很高兴今天在石景山首钢园&#xff0c;和大家一起沟通和探讨大模型的发展趋势&#xff0c;以及百度最近一段时间的思考和…

牛客NC26 括号生成【中等 递归 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca 思路 答案链接&#xff1a;https://www.lintcode.com/problem/427/solution/16924 参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参…

Llama模型下载

最近llama模型下载的方式又又变了&#xff0c;所以今天简单更新一篇文章&#xff0c;关于下载的&#xff0c;首先上官网&#xff0c;不管在哪里下载你都要去官网登记一下信息&#xff1a;https://llama.meta.com/llama2 然后会出现下面的信息登记网页&#xff1a; 我这里因为待…

软件工程学习笔记12——运行维护篇

运行维护篇 一、版本发布1、关于软件版本2、版本发布前&#xff0c;做好版本发布的规划3、规范好发布流程&#xff0c;保障发布质量 二、DevOps工程师1、什么是 DevOps 三、线上故障1、遇到线上故障&#xff0c;新手和高手的差距在哪里2、大厂都是怎么处理线上故障的 四、日志管…

MGRE实验

MGRE实验 1、实验要求 2、实验分析 IP地址分类 私网IP&#xff1a;192.168.1.0等隧道IP&#xff1a;192.168.5.0和192.168.6.0公网IP&#xff1a;15.0.0.1等 配置IP地址 配置acl访问控制列表 用于将内部网络中的私有IP地址转换为公共IP地址&#xff0c;以实现与外部网络的通…

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 &&…

集成在零售行业的应用

随着科技的飞速发展&#xff0c;集成化应用正在各行各业中发挥着越来越重要的作用。在零售行业&#xff0c;集成技术的广泛应用不仅提升了运营效率&#xff0c;还优化了顾客体验&#xff0c;推动了行业的转型升级。本文将深入探讨集成在零售行业的应用&#xff0c;并展望其未来…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构&#xff0c;其中编码器将…

MySQL 8:GROUP BY 问题解决 —— 怎么关闭ONLY_FULL_GROUP_BY (详细教程)

在使用 GROUP BY 时&#xff0c;我们可能会遇到以下报错&#xff1a; Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column …… 这是因为我们在select语句中所查询的列并不被group by后面接的列所包含。 对于GROUP BY聚合操作&#xf…

flink on yarn-per job源码解析、flink on k8s介绍

Flink 架构概览–JobManager JobManager的功能主要有: 将 JobGraph 转换成 Execution Graph,最终将 Execution Graph 拿来运行Scheduler 组件负责 Task 的调度Checkpoint Coordinator 组件负责协调整个任务的 Checkpoint,包括 Checkpoint 的开始和完成通过 Actor System 与 …

8、鸿蒙学习-HAR

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上。只能作为应用模块的依赖项被引用。 一、创建…