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://xiahunao.cn/news/2905119.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

产品SDK化转型:标准化与机构个性化定制解决方案

一、背景 在互联网行业中&#xff0c;企业通常可分为两大类别&#xff1a;2C和2B。对于2B企业而言&#xff0c;它们的产品往往以产品的形式提供给各个合作机构。以金融领域为例&#xff0c;一家2B金融公司通常将产品销售给各个银行和证券公司&#xff0c;这是2B领域常见的做法…

2.11 Python关键字(保留字)

Python关键字&#xff08;保留字&#xff09;一览表 保留字是Python 语言中一些已经被赋予特定意义的单词&#xff0c;这就要求开发者在开发程序时&#xff0c;不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。 Python 包含的保留字可以执行如下命令进行…

企业网站建设的方法的相关问题的解决办法的问题

现在市场上比较大的公司都建立了自己的企业网站&#xff0c;比如华为、小米等&#xff0c;在他们的企业网站中&#xff0c;可以充分展示自己产品的优势&#xff0c;介绍公司的优质服务。 这都是让顾客改变购买想法的重要因素。 现在互联网发达了&#xff0c;很多人在购买产品的…

k8s局域网通过operator部署rabbitmq

参考&#xff1a;Installing RabbitMQ Cluster Operator in a Kubernetes Cluster | RabbitMQ 1、下载cluster-operator.yml wget https://github.com/rabbitmq/cluster-operator/releases/download/v2.7.0/cluster-operator.yml 2、拉取对应的镜像&#xff0c;这里的版本是根…

腾讯云4核8g服务器多少钱?2024轻量和CVM收费价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

最优算法100例之10-数组中重复出现多次的数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不…

安全的内网通讯软件,WorkPlus定制化 IM/办公门户解决方案

如今处于数字化转型的“加速期”&#xff0c;政企正经历着一场数字化迭代升级的时代浪潮。而不少企业都已具备了数字化管理的意识&#xff0c;数字化应用场景也在全面推开。WorkPlus不断推动信息技术与企业业务深度融合&#xff0c;作为安全的内网通讯软件&#xff0c;为企业提…

【算法刷题 | 二叉树 05】3.28(左叶子之和、找树 左下角的值)

文章目录 11.左叶子之和11.1问题11.2解法一&#xff1a;递归11.2.1递归思路11.2.2代码实现 11.3解法二&#xff1a;栈11.3.1栈思想11.3.2代码实现 12.找树左下角的值12.1问题12.2解法一&#xff1a;层序遍历 11.左叶子之和 11.1问题 给定二叉树的根节点 root &#xff0c;返回…

|行业洞察·汽车|《2024新能源汽车行业及营销趋势报告-20页》

报告的主要内容解读&#xff1a; 新能源汽车行业概述及品牌分布&#xff1a; 近年来&#xff0c;中国新能源汽车销量增速高&#xff0c;市场占有率快速提升&#xff0c;成为汽车行业的重要增量。新能源汽车消费者趋向年轻化、女性化和高端化&#xff0c;对高科技、新体验有较高…

LeetCode:718最长重复子数组 C语言

718. 最长重复子数组 提示 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,…

解决:npx nuxi@latest module add image 问题

背景 在 nuxtJS项目中使用内置组件 NuxtImg , 按照官方操作如下图进行安装&#xff0c;在npm run dev 时&#xff0c;出现了报错&#xff1a; "ipx" is imported by "node_modules/nuxt/image/dist/runtime/ipx.mjs", but could not be resolved – treat…

Unity 学习日记 12.小球撞击冰块游戏

目录 1.准备场景 2.让小球动起来 3.用鼠标把小球甩出去 4.加入鼠标点击小球的判断 5.小球与冰块的碰撞测试 6.撞击后销毁冰块 ​编辑 7.显示游戏计时 8.显示扔球次数 9.显示剩余冰块个数 10.游戏结束 11.完整代码 下载源码 UnityPackage 最终效果&#xff1a; 1.准…

机器学习(三)

神经网络: 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。 f为激活(响应)函数: 理想激活函数是阶跃函数&#xff0c;0表示抑制神经元而1表示激活神经元。 多层前馈网络结构: BP(误差逆…

Git命令上传本地项目至github

记录如何创建个人仓库并上传已有代码至github in MacOS环境 0. 首先下载git 方法很多 这里就不介绍了 1. Github Create a new repository 先在github上创建一个空仓库&#xff0c;用于一会儿链接项目文件&#xff0c;按照自己的需求设置name和是否private 2.push an exis…

步态采集平台

&#x1f349;步骤一、读取视频每一帧图像 &#x1f349;步骤二、对读取的图像进行分割&#xff0c;得到全景下的步态轮廓图。 ​​​​​​​&#x1f349;步骤三、对读取的图像进行裁剪得到归一化的步态轮廓图。 ​​​​​​​&#x1f349;步骤四、保存这一帧步态轮廓图

MongoDB Atlas维护指南:常见类型、注意事项与窗口设置

为了给Atlas用户更好的产品体验&#xff0c;MongoDB产品团队会进行定期维护。 本文将会介绍&#xff1a; 常见维护项目种类及频率&#xff0c;注意事项维护期间的影响及建议维护窗口设置说明维护告警设置和邮件通知范例 维护窗口常见项目 定期SSL证书轮换软件升级&#xff…

Git--08--Git分支合并操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Git分支合并操作案例流程客户端&#xff1a;GitExtensions操作步骤&#xff1a;A操作步骤&#xff1a;B操作步骤&#xff1a;C操作步骤&#xff1a;D操作步骤&#…

多焦点图像融合文献学习(一)

本文介绍的是一篇明为"A convolutional neural network-based conditional random field model for structured multi-focus image fusion robust to noise."的文献&#xff0c;主要包括文献的摘要、前言摘选、主要贡献、网络结构、实验结果及结论等方面。 文献名称摘…

DC电源模块的设计与制造流程

BOSHIDA DC电源模块的设计与制造流程 DC电源模块是一种用于将交流电转换为直流电的设备。它广泛应用于各种电子设备中&#xff0c;如电子产品、工业仪器、电视等。下面是DC电源模块的设计与制造流程的简要描述&#xff1a; 1. 需求分析&#xff1a;在设计DC电源模块之前&#…

RegSeg 学习笔记(待完善)

论文阅读 解决的问题 引用别的论文的内容 可以用 controlf 寻找想要的内容 PPM 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC / SPPELAN &#xfffc; ASPP STDC&#xff1a;short-term dense concatenate module 和 DDRNet SE-ResNeXt …