文件基础和文件fd
文章目录
- 预备知识
- C语言的文件接口
- 系统调用
- 文件fd
正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。
预备知识
我们平时说文件就是说文件里面有什么,那么空文件有大小吗?答案肯定是有的,我们平时所说的文件除了文件的内容以外还存在文件的创建时间,大小等等,这是文件的属性,所以文件 = 内容 + 属性的。所以我们对文件的操作无非就是对文件内容或者对文件属性的操作。不管是内容还是属性,它们本质都是数据,所以他们被存储在磁盘中,就是磁盘文件。所以我们要访问一个文件的时候都是要把这个文件打开的,该文件被打开前就是磁盘文件,被打开后,因为CPU只和内存打交道,所以被打开的文件一定会被加载到内存。所以加载磁盘文件,一定会访问外设,这部分工作是由OS来做的。
一个进程是可以打开很多文件的,所以进程和文件的比例关系一定是 1 :n 。而在我们的系统中是有很多进程的,所以被打开的文件也可能会非常的多,所以OS要对这些文件进行管理,管理的本质就是先描述在组织,因此在OS中存在struct file结构体来描述文件,所以以后打开一个文件就创建一个file结构体,把他们用链表链起来,对文件的管理就成了对该链表的增删查改。
C语言的文件接口
C语言打开文件的是fopen

第一个参数就是打开文件的名称,可以使用绝对路径也可以使用相对路径,第二个参数是打开的模式,经常用的就是w以写的方式打开,但是每次打开都会清空文件,不存在就创建,还有一种常用的是a以追加的方式打开,每次打开不会清空文件,直接在文件结尾进行写入,依然是不存在就创建。还有r方式,是以只读的方式打开。经常用的就是这三种模式。
我们会发现w模式和我们指令所讲的输出重定向非常像。

a模式和追加重定向非常相似。

系统调用
我们再来认识一个系统调用open。

open函数是一个系统用调用,它的第一个参数就是文件名,和fopen一样,但是第二个参数是标志位。标志位有很多但是这里我们只介绍常用的几种。第三个参数是文件的权限,一般来说只有创建文件的时候需要设置。
关于函数传入标志为的技巧是Linux中常用的传参方式,接下来给兄弟们演示一下什么叫做标志位传参。
#include <stdio.h>#define Print1 1
#define Print2 (1 << 1)
#define Print3 (1 << 2)
#define Print4 (1 << 3)void printflag (int flag)
{if(flag & Print1) printf("i am Print1\n");if(flag & Print2) printf("i am Print2\n");if(flag & Print3) printf("i am Print3\n");if(flag & Print4) printf("i am Print4\n");
}
int main()
{printflag(Print1);printf("============================\n");printflag(Print1 | Print2);printf("============================\n");printflag(Print1 | Print2 | Print3);printf("============================\n");printflag(Print1 | Print2 | Print3 | Print4);printf("============================\n");return 0;
}

所以open的第二个参数第原理和这个基本上是差不多的,它的选项常用的O_WRONLY(只写)、O_RDONLY(只读)、O_CREAT(不存在就创建)、O_TRUNC(每次打开时清空文件)、O_APPEND(追加写,不清空文件)。open的返回值是一个fd(文件描述符),它是用来表示一个文件的。所以C语言中的FILE也一定封装了这个数字。有了这些选项的基础,我们可以来模仿实现一下fopen的各个选项的实现。
FILE _fopen(const char * str, char c)
{int flag = 0;int is_read;if(c == 'a'){flag = O_WRONLY | O_APPEND | O_CREAT;}else{if(c == 'w'){flag = O_WRONLY | O_TRUNC | O_CREAT;}else{if(c == 'r'){flag = O_RDONLY;is_read = 1;}else{//TODO}}}int fd = 0;if(is_read){fd = open(str, flag, 0x666);if(fd < 0){perror("open");exit(-1);} }else{fd = open(str, flag);if(fd < 0){perror("open");exit(-1);} }FILE file;// _fileno就是文件描述符file._fileno = fd;return file;
}
所以C语言的所有库函数的本质都是封装了系统调用。
文件fd
到这里我们可以来尝试理解一下文件了。如何在系统层面上理解一下文件呢?
我们知道每个进程在被创建是都是会有自己的PCB的,在Linux中也就是task_struct,所以每个进程的PCB中都有一个struct files_struct* files 的指针,这个指针指向的结构体中有一个非常重要的一张表,struct file* fd_array[],这是一个指针数组,我们打开的每一个文件都会被在这个指针数组中被指向,一般来说是从小到大来排列的,而数组的下标就是我们上面系统调用返回的文件描述符。所以文件描述符的本质就是数组的下标。操作系统访问文件只认识文件描述符。

我们进程在运行的时候,是会默认打开三个流,标准输入流、标准输出流、标准错误流。这三个流对应的硬件分别是键盘、显示器、显示器。因为Linux下一切皆文件,所以这三个流在进程被打开时会一次把文件描述符表的0、1、2位置给占了,所以我们自己打开的文件的fd一般是从3开始从小到大排的。

OS默认打开三个流,就是为了我们程序员默认进行输入输出的代码的编写。
我们如何理解一切接文件?
在file文件中是有函数指针的,所以对于不同的文件我们让它的文件指针指向对应的方法,如果没有改方法的话我们让这个指针指向空就行了,所以在上层看来,文件就是这个方法,但是它是可能对于不同的文件指向的方法也是不同的。

相关文章:
文件基础和文件fd
文章目录 预备知识C语言的文件接口系统调用文件fd 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…...
3dgs学习(二)—— 3d高斯与协方差矩阵及其几何意义
协方差矩阵与3d高斯 3d高斯与椭球与协方差矩阵 3d高斯,及3维空间内的正态分布。 通过一元正态分布的坐标系图像不难想象,3维空间中的正态分布点集中在一片椭球空间中,各方向长轴取决于各方向正态分布的方差。 而协方差矩阵通过计算多元之…...
ZStack Cube超融合入选IDC《中国超融合基础架构市场评估》报告
近日,IDC发布了《中国超融合基础架构市场评估,2023》。IDC针对中国超融合基础架构市场的发展现状展开了调研,明确了最终用户构建融合型云平台的痛点和难点,阐述了市场中各技术服务提供商的服务方案和优势,并对未来中国…...
每日一题——LeetCode1556.千位分隔符
方法一 个人方法: 把n转为字符串,逆序遍历n,把n的每个元素加入res,每三次加入.,最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…...
8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现
内容参考于:易道云信息技术研究院VIP课 上一个内容:通过逆向分析确定游戏明文接收数据过程 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:bcf7559184863febdcad819e48aa…...
Redis冲冲冲——事务支持,AOF和RDB持久化
目录 引出Redis事务支持,AOF和RDB持久化1、Redis的事务支持2、Redis的持久化 Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——事务支持,AOF和RDB持久化 Redis事务支持,AOF和…...
路由菜单路径匹配方法
优化路由菜单路径匹配算法:实现获取整条线路的路径 引言 在前端开发中,路由菜单的路径匹配是一个常见的需求。我们经常需要根据给定的路径,找到对应的菜单项,并获取整条线路的路径。本文将介绍一个优化的路由菜单路径匹配算法&…...
设计模式浅析(九) ·模板方法模式
设计模式浅析(九) 模板方法模式 日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 模板方法模式 概念 模板方法模式(Template Method Pattern)在Java中是…...
无用工作、UBI与AI
有些隐晦和黑暗的事实无法陈述,因为任何的系统中“无用”的结局都是被无情的抛弃和淘汰,AI监督下的人类结局更是如此。 什么是无用工作? 无用无效工作通常指的是那些看似忙碌但实际上对社会或个人没有实质性贡献的工作。这类工作可能包括以下…...
【监控】grafana图表使用快速上手
目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中,我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…...
Django常用命令
一、新建一个新项目 django-admin startproject project_name二、新建一个app 在Django中的一个app代表一个功能模块。开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。 python manage.py startapp appa_name三、数据迁移(更新数据库) 编写好了Model后&#x…...
【center-loss 中心损失函数】 原理及程序解释(更新中)
文章目录 前言问题引出open-set问题抛出 解决方法softmax函数、softmax-loss函数解决代码(center_loss.py)原理程序解释 如何梯度更新首先了解一下基本的梯度下降算法然后 前言 学习一下: 中心损失函数,用于用于深度人脸识别的特…...
什么是 HTTPS 证书?作用是什么?
HTTPS 证书,即超文本传输安全协议证书(Hypertext Transfer Protocol Secure),是网站安全的关键组成部分。它通过 SSL/TLS 加密协议,确保用户与网站之间的数据传输是加密和安全的。 什么是 HTTPS 证书? HT…...
为什么软考报名人数越来越多?
2020年软考报名人数404666人,广东省报考人数超过14万人。 ●2021年软考通信考试报名人数突破100万人,估计软考有90多万。 ●2022年软考通信考试共129万人,估计软考占了120多万人。 ●2023年软考具体报名人数没有公布,但工业和信…...
【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024)
【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024) 重要信息 会议官网:http://www.icimlai.com会议地址:深圳召开日期:2024.03.30截稿日期:2024.03.20 (先…...
html2canvas 将DOM节点转成图片
官网地址:html2canvas - Screenshots with JavaScript 将js文件保存到本地 可以新建一个txt文件,然后丢进去修改后缀名称即可。 在项目中引入js文件: import html2canvas from "../html2canvas.min.js" 这是我准备画的DOM节点。…...
【多线程】常见锁策略详解(面试常考题型)
目录 🌴 乐观锁 vs 悲观锁🎍重量级锁 vs 轻量级锁🍀自旋锁(Spin Lock)🎋公平锁 vs ⾮公平锁🌳可重⼊锁 vs 不可重⼊锁🎄读写锁⭕相关面试题 常⻅的锁策略 注意: 接下来讲解的锁策略不…...
Python列表操作函数
在Python中,列表(list)是一种可变的数据类型,它包含一系列有序的元素。Python提供了一系列内置的函数和方法来操作列表。以下是一些常用的Python列表操作函数和方法: 列表方法 append(x) 将元素x添加到列表的末尾。 …...
Qt注册类对象单例与单类型区别
1.实现类型SingletonTypeExample #ifndef SINGLETONTYPEEXAMPLE_H #define SINGLETONTYPEEXAMPLE_H#include <QObject>class SingletonTypeExample : public QObject {Q_OBJECT public://只能显示构造类对象explicit SingletonTypeExample(QObject *parent nullptr);//…...
Rocky Linux 运维工具yum
一、yum的简介 yum是用于在基于RPM包管理系统的包管理工具。用户可以通过 yum来搜索、安装、更新和删除软件包,自动处理依赖关系,方便快捷地管理系统上的软件。 二、yum的参数说明 1、install 用于在系统的上安装一个或多个软件包 2、seach 用…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
