当前位置: 首页 > news >正文

文件基础和文件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 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…...

3dgs学习(二)—— 3d高斯与协方差矩阵及其几何意义

协方差矩阵与3d高斯 3d高斯与椭球与协方差矩阵 3d高斯&#xff0c;及3维空间内的正态分布。 通过一元正态分布的坐标系图像不难想象&#xff0c;3维空间中的正态分布点集中在一片椭球空间中&#xff0c;各方向长轴取决于各方向正态分布的方差。 而协方差矩阵通过计算多元之…...

ZStack Cube超融合入选IDC《中国超融合基础架构市场评估》报告

近日&#xff0c;IDC发布了《中国超融合基础架构市场评估&#xff0c;2023》。IDC针对中国超融合基础架构市场的发展现状展开了调研&#xff0c;明确了最终用户构建融合型云平台的痛点和难点&#xff0c;阐述了市场中各技术服务提供商的服务方案和优势&#xff0c;并对未来中国…...

每日一题——LeetCode1556.千位分隔符

方法一 个人方法&#xff1a; 把n转为字符串&#xff0c;逆序遍历n&#xff0c;把n的每个元素加入res&#xff0c;每三次加入.&#xff0c;最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…...

8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;通过逆向分析确定游戏明文接收数据过程 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;bcf7559184863febdcad819e48aa…...

Redis冲冲冲——事务支持,AOF和RDB持久化

目录 引出Redis事务支持&#xff0c;AOF和RDB持久化1、Redis的事务支持2、Redis的持久化 Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——事务支持&#xff0c;AOF和RDB持久化 Redis事务支持&#xff0c;AOF和…...

路由菜单路径匹配方法

优化路由菜单路径匹配算法&#xff1a;实现获取整条线路的路径 引言 在前端开发中&#xff0c;路由菜单的路径匹配是一个常见的需求。我们经常需要根据给定的路径&#xff0c;找到对应的菜单项&#xff0c;并获取整条线路的路径。本文将介绍一个优化的路由菜单路径匹配算法&…...

设计模式浅析(九) ·模板方法模式

设计模式浅析(九) 模板方法模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 模板方法模式 概念 模板方法模式&#xff08;Template Method Pattern&#xff09;在Java中是…...

无用工作、UBI与AI

有些隐晦和黑暗的事实无法陈述&#xff0c;因为任何的系统中“无用”的结局都是被无情的抛弃和淘汰&#xff0c;AI监督下的人类结局更是如此。 什么是无用工作&#xff1f; 无用无效工作通常指的是那些看似忙碌但实际上对社会或个人没有实质性贡献的工作。这类工作可能包括以下…...

【监控】grafana图表使用快速上手

目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中&#xff0c;我们使用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函数解决代码&#xff08;center_loss.py&#xff09;原理程序解释 如何梯度更新首先了解一下基本的梯度下降算法然后 前言 学习一下&#xff1a; 中心损失函数&#xff0c;用于用于深度人脸识别的特…...

什么是 HTTPS 证书?作用是什么?

HTTPS 证书&#xff0c;即超文本传输安全协议证书&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff0c;是网站安全的关键组成部分。它通过 SSL/TLS 加密协议&#xff0c;确保用户与网站之间的数据传输是加密和安全的。 什么是 HTTPS 证书&#xff1f; HT…...

为什么软考报名人数越来越多?

2020年软考报名人数404666人&#xff0c;广东省报考人数超过14万人。 ●2021年软考通信考试报名人数突破100万人&#xff0c;估计软考有90多万。 ●2022年软考通信考试共129万人&#xff0c;估计软考占了120多万人。 ●2023年软考具体报名人数没有公布&#xff0c;但工业和信…...

【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024)

【投稿优惠|快速见刊】2024年图像&#xff0c;机器学习和人工智能国际会议&#xff08;ICIMLAI 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icimlai.com会议地址&#xff1a;深圳召开日期&#xff1a;2024.03.30截稿日期&#xff1a;2024.03.20 &#xff08;先…...

html2canvas 将DOM节点转成图片

官网地址&#xff1a;html2canvas - Screenshots with JavaScript 将js文件保存到本地 可以新建一个txt文件&#xff0c;然后丢进去修改后缀名称即可。 在项目中引入js文件&#xff1a; import html2canvas from "../html2canvas.min.js" 这是我准备画的DOM节点。…...

【多线程】常见锁策略详解(面试常考题型)

目录 &#x1f334; 乐观锁 vs 悲观锁&#x1f38d;重量级锁 vs 轻量级锁&#x1f340;自旋锁&#xff08;Spin Lock&#xff09;&#x1f38b;公平锁 vs ⾮公平锁&#x1f333;可重⼊锁 vs 不可重⼊锁&#x1f384;读写锁⭕相关面试题 常⻅的锁策略 注意: 接下来讲解的锁策略不…...

Python列表操作函数

在Python中&#xff0c;列表&#xff08;list&#xff09;是一种可变的数据类型&#xff0c;它包含一系列有序的元素。Python提供了一系列内置的函数和方法来操作列表。以下是一些常用的Python列表操作函数和方法&#xff1a; 列表方法 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​来搜索、安装、更新和删除软件包&#xff0c;自动处理依赖关系&#xff0c;方便快捷地管理系统上的软件。 二、yum的参数说明 1、install 用于在系统的上安装一个或多个软件包 2、seach 用…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...