直播系统开发/网站优化流程
文件IO
- 文件的常识
- 基础IO
- 为什么要学习操作系统的文件操作
- C语言对于函数接口的使用
- 接口函数介绍
- 如何理解文件
- 文件描述符
- 重定向
- 更新给模拟实现的shell增加重定向功能
- 为什么linux下一切皆文件?
文件的常识
1.空文件也要在磁盘占据空间
2.文件 = 内容 + 属性
3.文件操作 = 对内容 + 对属性
4.标定一个文件,必须使用文件路径 + 文件名(唯一性)
5.如果没有指明对应的文件路径,默认是在当前路径进行访问
6.当我们把fopen,fclose,fread,fwrite等接口写完之后,代码编译之后,形成二进制可执行程序之后,但是没运行,文件对应的操作有没有被执行呢?没有 —— 对文件操作的本质是进程对文件的操作。
7.一个文件如果没被打开,可以直接进行文件访问吗??不能!一个文件要被访问,就必须先被打开!(被打开的时候是用户调用端口,操作系统负责操控硬件,所以这个操作是用户进程和操作系统共同完成的)
8.磁盘的文件不是所有的都被打开,是一部分被打开,一部分关闭。
总结:文件操作的本质是进程和被打开文件之间的关系。
基础IO
为什么要学习操作系统的文件操作
语言中,C,C++,java,python,php都有文件操作的接口,可是每个接口都不一样。
但是文件是在磁盘中,磁盘是硬件,那么想访问文件就不能绕过操作系统,要使用操作系统提供的接口。
但是操作系统的接口是不会变的,语言层面的操作文件也是通过对操作系统的这些接口进行封装而已。
所以学习底层操作系统能让我们在以后学习其他语言上手更快。
C语言对于函数接口的使用
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
wb只写方式打开或新建一个二进制文件,只允许写数据。
wb+读写方式打开或建立一个二进制文件,允许读和写。
r打开只读文件,该文件必须存在,否则报错。
r+打开可读写的文件,该文件必须存在,否则报错。
rb+读写方式打开一个二进制文件,只允许读写数据。
a以附加的方式打开只写文件。
a+以附加方式打开可读写的文件。
ab+读写打开一个二进制文件,允许读或在文件末追加数据。加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
接口函数介绍
首先注意一个细节,文件的起始掩码是666,创建出文件是这样得出权限的:666 & ~numask。
先说第一个参数是包含路径的文件名(没有默认就是当前路径),第二个参数是你要进行什么操作,是一个C传标记为,靠比特位得到信息的参数,第三个参数是输入权限,起始文件的权限就是0666.。
正确返回值是文件描述符(其实就是一个小整数,下面会说明由来),错误是-1。
注意:在使用open时,如果不存在该文件,一定要注意第二个参数要传什么参数,第三个参数是必须要传的,不然就是错误文件。
这个函数可以传三个参数的原因就是为了处理不存在的文件。
这里先说一下C传标记位。
假如有八个比特位,每个比特位变成1,其他均为0,那么就有8种:
那么到时候就可以这样用:
#include<stdio.h>
#define ONE (1 << 0)
#define TWO (1 << 1)
#define FOUR (1 << 2)
#define EIGHT (1 << 3)
void print(int x)
{if(x&ONE)printf("ONE\n");if(x&TWO)printf("TWO\n");if(x&FOUR)printf("FOUR\n");if(x&EIGHT)printf("EIGHT\n");
}
int main()
{print(ONE);//打印ONEprint(ONE|TWO);//打印ONE,TWOprint(ONE|TWO|FOUR)//打印ONE,TWO,FOURprint(ONE|TWO|FOUR|EIGHT)//打印ONE,TWO,FOUR,EIGHTreturn 0;
}
open函数的第二个参数也是同样的道理:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
O_TRUNC : 清空文件中的内容
这里就创建了一个文件,权限是对应666.
这里注意一下,umask设置的是当前进程的,跟shell的没关系。
这是系统写入函数:
第一参数是你要写入的是文件描述符,第二参数是我们要写入缓冲区的位置,第三个是你要放进去的大小,返回值后面再说。
第二个参数是是void*,这是因为文本可以纯文本和二进制读取,但是在操作系统看来都是二进制,这个分类其实是语言给的分类。
经过上面的举例其实就会发现C语言调用的fopen其实就是在传参给open上面的四个参数而已。
这是从文件中读取内容的函数.
第一个参数是文件描述符,第二个参数是从特定文件读取内容到缓冲区,第三个参数是读取多少个,实际上输入的500,如果缓冲区只有50,那么它只会读取50。
第二个参数也是void*,也是没有类型概念的。
如何理解文件
文件操作的本质:进程和被打开文件的关系。
首先进程是可以打开多个文件的,系统中一定会有大量被打开的文件,那么如何管理这些文件呢?其实就像管理进程一样,先描述,再组织,先来看这一段代码:
这里发现文件是有顺序的,那么为什么不像数组一样从0开始呢?
因为有三个标准输出流的存在:
stdin ——>键盘
stdout ——>显示器
stderr ——>显示器
这三个就是排在前面顺序的!
并且,C语言的FILE指针是一个结构体,因为在系统层面只认识文件描述符,所以里面必定有一个字段是文件描述符。
所以是从0开始的,但是前三个被占用了。
那么数字为什么是从0开始的呢?
磁盘中被进程打开到内存中然后是通过struct file这个类型来描述放到内存中,然后进程的PCB中里面有一个struct file_struct *files这个指针指向一个struct file*array[]的数组来管理这些文件。
总结:文件描述的本质就是数组的下标!
文件描述符
重定向
上面我们知道了0,1,2都被占用了,那么是否能够将我们的文件fd变成0,1,2呢
这样是可以的,也就是说,fd的分配规则是从0开始,一个新文件要打开的时候会先去扫面当前进程中的文件表,找到一个最小的没有被使用的文件描述符。
这里我们把1关闭试试:
什么都没有打印出来,这是因为1是标准输入,但是就算那一行关闭了最后也打开了,为什么没有打印出来呢?
这是因为,1的位置里面已经是log.txt文件的地址了,所以到最后都没有打印出来。
那么,也就是说只要是让输入的输入到stdout中是不是就可以打印出来结果了呢?
这里依然什么都没有,这时因为stdout其实就是文件表中1的位置,但是这里1的位置已经换成了log.txt,那么是不是说明会将我们要打印到屏幕上的内容变成打印到log.txt文件的内容呢?
这里什么都没有,但是确实是这样的,只不过是缓冲区的问题,这里我们强制刷新一下:
本来应该往显示器里打印的内容却打印到了文件里,这个特性就叫做重定向。
> 输出重定向
>>追加重定向
<输入重定向
重定向的本质就是,上层fd不变,在内核中更改fd对应的struct file*的地址。
但是像刚才举例,关闭对应的文件然后再进行写入,这种重定向的方式太搓,有一个函数是重定向用的:
看dup2,两个参数就是文件表的下标,也就是fd,这个函数是把文件表内的两个内容拷贝。
注意,拷贝是覆盖,也就是说最后只能由一个内容!
第一个参数你你要写的内容,第二个参数是你要写的位置。
这里fd就是3了,因为是将fd的内容拷贝到1中,所以0,1,2的位置还是有内容的,fd分到的还是3。
同时我们想在屏幕上打印也不可以了,因为1也指向了fd指向的文件。
如果想要追加内容,那么打开文件的时候第二个参数记的变换。
更新给模拟实现的shell增加重定向功能
重定向是让fd中的内容进行改变,所以在执行命令之前,要先分割命令的时候,分成两个部分,从">“,”>>“,”<“中开始分割。
前面的还是按照原来的程序执行,后面的去处理重定向内容,那么怎么进行分割呢?我们可以将.”>“,”>>“,”<",变成\0。
重定向先设置四个宏,分别代表,目前没有重定向,>,>>,<.
在设置两个全局变量,一个是说明什么类型的重定向,另一个是重定向的文件是哪个。
这个宏是跳过字符串空格的意思。
这个就是函数就是分割了命令串,是否是重定向,怎么重定向,文件是哪一个。
然后就是进行重定向了,首先要清楚,因为命令都是通过子进程去完成的,所以重定向也是通过子进程去完成的。
那么,为什么子进程操作不影响父进程的呢?
首先,进程拥有独立性,文件表也会拷贝父进程一份,但是文件是不会被拷贝的,也就是说子进程重定向是更改子进程的文件表,并不会影响父进程的。
并且,程序替换的时候也不会影响重定向打开的文件,因为程序替换替换的是程序的代码,而内存中的PCB,文件表,文件,都属于内核数据结构,就像进程的替换不会影响PCB内容的变化,也不会影响pid,ppid一样。
这样就完成了。
为什么linux下一切皆文件?
比如一些硬件,他们有自己的内核数据结构,他们每个都有自己的读写方法(键盘没有写功能,那就指向空),每种硬件读写方式都是不同的。
那么既然是不同的数据结构,怎么进行管理呢?
这时候就会定义一个结构体,里面记录硬件的数据,也能调用对应硬件的读写接口。
file是链接起来的,先描述,再组织。
所以操作系统看来,只需要调用file就可以了,所以说linux下皆文件。
那么,上面说到重定向的时候,为什么我们子进程退出时关闭了一个文件,按理来说父进程也会关闭文件,但是并没有,因为有一个叫做引用计数:
在结构体中有一个专门计数有多少个指针指向这个位置,如果这个数为0,文件就会关闭,如果不为0,即便是子进程关闭文件也就等于这个数减一而已。
因为用户要关闭文件和打开文件,只是我们去告诉操作系统我们要这么去做而已,剩下的就让操作系统实现具体内容。
相关文章:

Linux文件基础I/O
文件IO文件的常识基础IO为什么要学习操作系统的文件操作C语言对于函数接口的使用接口函数介绍如何理解文件文件描述符重定向更新给模拟实现的shell增加重定向功能为什么linux下一切皆文件?文件的常识 1.空文件也要在磁盘占据空间 2.文件 内容 属性 3.文件操作 对…...

HTML看这一篇就够啦,HTML基础大全,可用于快速回顾知识,面试首选
HTML 1 基础 1.1 DOCTYPE <!DOCTYPE> 文档类型声明,作用就是告诉浏览器使用哪种HTML版本来显示网页。 <!DOCTYPE html> 这句代码的意思是: 当前页面采取的是 HTML5 版本来显示网页. 注意: 声明位于文档中的最前面的位置,处于 标签之前。 …...

Altium Designer(AD)软件使用记录05-PCB叠层设计
目录Altium Designer(AD)软件使用记录05-PCB叠层设计一、正片层和负片层的介绍1、正片层(Signal)2、负片层(Plane)3、内电层的分割实现二、正片层和负片层的内缩设计1、负片设置内缩20H原则2、正片铺铜设置内缩1、设置规则2、重新铺铜三、AD的层叠设计四、叠层设计需要注意的问…...

ArcGIS动态表格批量出图
一.产品介绍:ArcGIS动态表格扩展模块Mapping and Charting Solutions,可用于插入动态表格,与数据驱动结合,出图效率无敌。注:优先选择arcgis10.2.2。 二、下载连接: https://www.xsoftnet.com/share/a001CX…...

ChatGPT真神奇,但是也真焦虑
ChatGPT火爆ChatGPT的火爆程度不用说也知道。就目前来说,已经开始冲击各行业了,比如客服、智能助手、语言学习、自然语言处理等等等。。ChatGPT冲击冲击最高的可能就是中间这个段位的了。高段位无法取代,但是低段位,通过使用ChatG…...

mos管驱动与米勒平台介绍、消除
mos驱动设计 1.选择适当的驱动芯片 为了控制MOSFET,需要使用专门的驱动芯片。选择合适的芯片需要考虑MOSFET的电压和电流需求。常见的驱动芯片包括IR2110、IR2184、MIC4424等。 2.设计电路 在驱动电路中,需要加入一些电路元件来保证MOSFET的顺畅工作…...

20230311英语学习
Philosophy of Food: Guidelines for an Authentic Approach to Eating 饮食哲学:值得思考的问题 Whats Philosophical About Food? Philosophy of food finds its basis on the idea that food is a mirror.Eating mirrors the making of a self, that is, the …...

【面试题】Nginx面试题汇总(无解答)
什么是Nginx?谈谈个人都理解,项目中是否用到,为什么要用,有什么优点?为什么要用Nginx?为什么Nginx性能这么高?Nginx怎么处理请求的?什么是正向代理和反向代理?使用“反向…...

Java面试总结(六)
进程和线程的区别 根本区别: 进程时操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。 资源开销: 每个进程都有自己独立的代码和数据空间(程序上下文),进程之间的切换开销比较大&…...

Windows逆向安全(一)C与汇编的关系
前言 逆向是一种新型的思维模式也是软件开发领域中极为重要的技术,涵盖各种维度去深挖软件架构的本质和操作系统原理,学习逆向后可以在各领域中发挥至关重要的作用,其中包括黑灰色,安全开发,客户端安全,物…...

Lazada、Allegro、速卖通测评自养号技术(方法解析)
无论是亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、雅虎、eBay、TikTok、Newegg、乐天、美客多、阿里国际、沃尔玛、OZON、Joom、Facebook、Coupang、独立站、Cdiscount、Kaufland、DARTY、Allegro、MANO等平台测评自养号对于卖家来说算是一种低成本、高回…...

Vue3的composition API—setup函数, ref函数,reactive函数
1、Setup 函数 1.setup 是vue3中的一个配置项 2、setup是所有组件所需要的数据和方法都需要配置到setup中的 3、setup两种返回值: 若返回一个对象 若返回一个渲染函数 mian.js文件 注意:尽量不与Vue2混用 setup中无法访问vue2中的配置 不能是async函数…...

国外seo比较好的优化方法有哪些?
随着互联网的不断发展,SEO(搜索引擎优化)变得越来越重要。 对于国外市场,Google搜索引擎是最为重要的搜索引擎之一, 因此在优化国外网站时,需要将Google SEO优化作为首要任务。 关键词研究和优化 在进行…...

【JavaEE进阶】——第一节.Maven国内源配置
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 操作步骤 1.打开项目配置界面(当前项目配置) 2.检查并配置国内源 3.再次打开项目配置界面(新项目配置) 4…...

dockerFile编写
dockerFile编写 语法参数 # DockerFile常用指令 USER # 指定运行的用户,一般不用配置 FROM # 拉取基础镜像,一切从这里开始构建 ARG # 构建参数,只能在dockerFile中使用, # eg: JAR_FILEtarget/springboot-mongo-0.0.1-SNAPSHOT.jar MAI…...

jenkins扩展你的流水线
文章目录一、概述二、可信库和不可信库可信库不可信库三、内部库与外部库内部库SSH访问HTTP 访问外部库配置一个外部库四、在流水线脚本中使用库从源码版本控制中自动下载库加载库到脚本中Library 注解库步骤库指令五、Jenkins 项目中的库范围六、共享库代码的结构src示例一&am…...

Golang模糊测试入门
本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以试图找到漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。 在本教程中,您将为一个简单的函数编写模糊测试,运行 go 命…...

ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植
一、添加DDR初始化1 1、分析下一步的移植路线 (1) cpu_init_crit 函数成功初始化串口、时钟后,转入 _main 函数,函数在 arch/arm/lib/crt0.S 文件中。 (2) 在 crt0.S 中首先设置栈,将 sp 指向 DDR 中的栈地址; #if defined(CONF…...

不用索引怎么优化百亿数据? | MySQL性能优化篇
文章目录数据库调优一、数据库调优原理1.1 为什么要进行MySQL数据库调优?1.2 什么影响数据库性能?1.3 数据库调优到底调什么?二、数据库压力测试2.1 什么是压测?2.2 JMeter简介2.3 驱动下载2.4 测试过程三、连接池3.1 压力测试连接…...

JavaScript(WebAPI)
目录 1.什么是Web API? 2.DOM和DOM树 3.获取元素 4.事件 5.操作元素 获取/修改元素内容 1.innerText 2. innerHTML 获取/修改元素属性 获取/修改表单元素属性 获取/修改样式属性 1.修改内联样式 2.修改元素应用的CSS类名 6.操作节点 新增节点 删除节点 7.案例…...

idea集成GitHub
设置 GitHub 账号绑定账号有两种方式:1. 通过授权登录2.如果上述登录不成功,用Token口令的方式登录,口令在github账号哪里生成,点击settings --->Developer settings --->pwrsonal access tokens ----> 复制口令到idea 口…...

软考高级信息系统项目管理师系列之四十一:项目组合管理
软考高级信息系统项目管理师系列之四十一:项目组合管理 一、项目组合管理内容二、项目组合管理基础概述1.项目组合定义及相关知识图2.项目组合、项目集和项目之间的关系3.项目组合模块具备的特征三、项目组合管理1.项目组合管理定义及要求2.不同级别管理之间的特性及关联3.项目…...

Spring——Spring整合Mybatis(XML和注解两种方式)
框架整合spring的目的:把该框架常用的工具对象交给spring管理,要用时从IOC容器中取mybatis对象。 在spring中应该管理的对象是sqlsessionfactory对象,工厂只允许被创建一次,所以需要创建一个工具类,把创建工厂的代码放在里面&…...

【专项训练】布隆过滤器和LRU缓存
布隆过滤器:与哈希表类似 哈希表是一个没有误差的数据结构! 有哈希函数得到index,会把要存的整个元素放在哈希表里面 有多少元素,每个元素有多大,所有的这些元素需要占的内存空间,在哈希表中都要找相应的内存大小给存起来 事实上,我们并不需要存所有的元素本身,而是只…...

从一道面试题看 TCP 的吞吐极限
分享一个 TCP 面试题:单条 TCP 流如何打满香港到旧金山的 320Gbps 专线?(补充,写成 400Gbps 更具迷惑性,但预测大多数人都会跑偏,320Gbps 也就白给了) 这个题目是上周帮一个朋友想的,建议他别问三次握手&a…...

rsync 的用法
rsync 介绍下 用法 rsync是一个常用的数据同步工具,它能够在本地和远程系统之间同步文件和目录。以下是rsync的基本用法: 同步本地文件夹: bash Copy code rsync -av /path/to/source /path/to/destination其中,-a表示归档模式&…...

【LeetCode每日一题:[面试题 17.05] 字母与数字-前缀和+Hash表】
题目描述 给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。 返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。 示例 1: 输入…...

华为OD机试题 - 简易压缩算法(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:简易压缩算法题目输入输出示例一输入输出说明示例二输入输出说明…...

Kubenates中的日志收集方案ELK(下)
1、rpm安装Logstash wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.7.rpm yum install -y logstash-6.8.7.rpm2、创建syslog配置 input {beats{port> 5044 } }output {elasticsearch {hosts > ["http://localhost:9200"]index …...

LeetCode - 42 接雨水
目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 42. 接雨水 - 力扣(LeetCode) 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1 输入&…...