Linux系统编程,Linux中的文件读写文件描述符

文章目录

  • Linux系统编程,Linux中的文件读写操作
    • 1.open函数,打开文件

Linux系统编程,Linux中的文件读写操作

1.open函数,打开文件

我们来看下常用的open函数

在这里插入图片描述

这个函数最终返回一个文件描述符struct file

我们查看一下它的Ubuntu内核源代码

struct file {union {struct list_head fu_list; //文件对象链表指针linux/include/linux/list.hstruct rcu_head fu_rcuhead; //RCU(Read-Copy Update)是Linux 2.6内核中新的锁机制} f_u;struct path f_path; //包含dentry和mnt两个成员,用于确定文件路径#define f_dentry f_path.dentry //f_path的成员之一,当前文件的dentry结构#define f_vfsmnt f_path.mnt //表示当前文件所在文件系统的挂载根目录const struct file_operations *f_op; //与该文件相关联的操作函数atomic_t f_count; //文件的引用计数(有多少进程打开该文件)unsigned int f_flags; //对应于open时指定的flagmode_t f_mode; //读写模式:open的mod_t mode参数loff_t     f_pos;//当前文件指针位置off_t f_pos; //该文件在当前进程中的文件偏移量struct fown_struct f_owner; //该结构的作用是通过信号进行I/O时间通知的数据。unsigned int f_uid, f_gid;// 文件所有者id,所有者组idstruct file_ra_state f_ra; //在linux/include/linux/fs.h中定义,文件预读相关unsigned long f_version;//记录文件的版本号,每次使用之后递增#ifdef CONFIG_SECURITYvoid *f_security;#endif/* needed for tty driver, and maybe others */void *private_data;//使用这个成员来指向分配的数据#ifdef CONFIG_EPOLL/* Used by fs/eventpoll.c to link all the hooks to this file */struct list_head f_ep_links;spinlock_t f_ep_lock;#endif /* #ifdef CONFIG_EPOLL */struct address_space *f_mapping;};

我们使用open函数的时候,传入的参数就会被记录在内核中,

int open(const char *pathname, int flags, mode_t mode);

返回int就是对应的file在数组中的位置,struct file[],

flags --》unsigned int f_flags; //对应于open时指定的flag

mode --》mode_t f_mode; //读写模式:open的mod_t mode参数

loff_t f_pos;//当前文件指针位置,文件读写的时候的偏移地址

我们看下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 (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);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 *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, int datasync);int (*aio_fsync) (struct kiocb *, 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 **);
};

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

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

相关文章

什么是集成测试?集成的方法有哪些?

前言 综合测试整合测试非常复杂,需要一些开发和逻辑技能。的确如此!那么把这个测试整合到我们的测试策略中的目的是什么呢?这个问题我们先不着急回答,让我们一步步往下看你就知道了。 为什么要进行集成测试? 以下是一…

四川竹哲电子商务有限公司怎么样?是真的吗

在当今数字化时代,抖音电商服务逐渐成为了企业营销的重要手段。在这个充满机遇与挑战的领域,四川竹哲电子商务有限公司以其卓越的服务质量,成为了行业内的佼佼者。本文将详细介绍四川竹哲电子商务有限公司的抖音电商服务,帮助您了…

Kyligence 入选 Gartner® 2023 客户之声报告,高分获评“卓越表现者”

近日,Gartner 发布了最新的《2023 分析和商业智能平台“客户之声”报告》(Voice of the Customer for Analytics and Business Intelligence Platforms, 2023, October 2023)。跬智信息(Kyligence)成功入选该报告,并凭借 4.7 分&a…

第四代内涝积水监测仪:城市内涝积水监测仪厂家直销

城市内涝频发,导致居民被迫迁离家园,前往其他安全区域;同时,城市基础设施受损,引发各种安全隐患。此外,淤泥在城市各处堆积,可能产生病毒和细菌,对公共卫生造成威胁。 每个城市都在为…

金融行业如何数字化转型?_光点科技

金融行业的数字化转型涉及技术创新的引入、客户体验的改善、内部流程的优化、安全和合规性的加强以及员工技能和企业文化的转变。 技术创新 包括云计算、人工智能、大数据分析和区块链技术的采用。云计算增强数据处理的灵活性,AI和机器学习在风险评估和欺诈检测方面…

得帆信息携手深信服,联合打造高安全PaaS超融合一体化解决方案

上海得帆信息技术有限公司(以下简称“得帆”)和深信服科技股份有限公司(以下简称“深信服”)携手推出融合安全性、稳定性、高效性于一体的全新PaaS超融合解决方案。 用户痛点分析 全面推进企业数字化与信息化的趋势下,…

优雅写代码之《项目规范》-附加树状图生成

阿丹: 最近有一些小伙伴在跳槽之后接触到了新的项目小组,在讨论如何整理出漂亮的项目结构以及代码书写的时候,既然有小伙伴发问了,那当然就要一起学习,来!开卷!本文章只作为一个分享&#xff0c…

C# DirectoryInfo类的用法

在C#中,DirectoryInfo类是System.IO命名空间中的一个类,用于操作文件夹(目录)。通过DirectoryInfo类,我们可以方便地创建、删除、移动和枚举文件夹。本文将详细介绍DirectoryInfo类的常用方法和属性,并提供…

C++之使用std::move与否的实例区别(二百五十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

计讯物联LoRa终端TW820多重优势共蓄能,强力驱动行业发展

LoRa,即远距离无线电,是一种低功耗宽区域网络(LPWAN)的通信技术。它在同样的功耗条件下比其他无线方式传播的距离更远,且比传统的无线射频通信距离扩大3-5倍,真正实现了低功耗、远距离、广覆盖的统一。基于LoRa通信技术的优势特点…

盘点49个Python网站项目Python爱好者不容错过

盘点49个Python网站项目Python爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1aFYJtNZjgst1l5KFBckP2A?pwd8888 提取码:8888 项目名称 A simpleshorturl…

现代浴室:从硬朗到柔美

现代浴室不再是冰冷的地方,而是一个温馨的角落。它是我们日常生活中的庇护所,一个能够唤起宁静和舒适感的地方。如今,浴室的设计注重的是颜色、材质、光线和表面的精心搭配,以创造一个柔和、温馨的空间。 与过去的硬朗陶瓷、锋利…