基础IO的学习

server/2025/2/3 7:47:12/

1. 理解文件

文件在磁盘里(磁盘本身是外设)

磁盘是永久性存储介质,文件在磁盘上的存储是永久的

磁盘是的文件 本质是对文件的所有操作,都是对外设的输入和输出  简称IO

对文件的操作本质是进程对文件的操作

磁盘的管理者是操作系统

文件读写的本质是通过文件相关的系统调用接口来实现的,并不是通过库函数来操作的,这些库函数只是为用户提供方便

2. 文件接口

cwd : 指向当前进程运行目录的一个符号链接

2.1 打开文件

打开文件本质是进程打开,进程知道自己在哪里,即使文件不带路径进程也知道,OS就能知道要创建的文件放在哪里

2.2 输出信息到显示器上的方法

2.3 stdin  stdout  stderr

C默认会打开三个输入输出流

都是FILE*类型,fopen返回值类型,文件指针

stdin          标准输入      硬盘文件

stdout        标准输出     显示器文件

stderr         标准错误     显示器文件

2.4 打开文件的方式

w方式文件会被清空

类似 >

a 方式是追加

类似 >>

3. 系统文件

3.1 相关接口 open write read 

On  success,  the  number of bytes read is returned (zero indicates end of file)

pathname: 要打开或者创建的文件的文件名

flags:传入的参数

            O_RDONLY  只读打开

            O_WRONLY  只写打开

            O_RDWR  读,写打开

                               这三个常量,必须只读一个且只能指定一个

            O_CREAT 如果文件不存在就创建   必须使用mode,来指明文件权限

            O_APPEND 追加写

            O_TRUNC  清空写

要新建一个文件必须把权限带上

只要把文件内容写入就可以了,不用+1

要传递这几个标志位

如果不存在就新建   以只写方式   清空

系统不关心我们的写入方式   所以write接口是void*

3.2 文件描述符(fd)

3.2.1 0 1 2

对文件的内容做任何操作都必须先把文件加载到内核对应的文件缓冲区内(加载是文件->内核的拷贝)

3.3 重定向

dup2 系统调用

一个系统调用接口,用于文件描述符管理和重定向

dup2() males newfd be the copy of oldfd, closing newfd first if necessary;

输入重定向

虽然标准输出和标准错误都指向同一个文件,但当我们进行重定向时,本质上是把1重定向到新文件,把新打开的文件描述符的地址拷贝到1里面

写在一起

a.out 通常是一个默认生成的可执行文件名,尽管现代系统和编译器提供了更多的配置选项来自定义输出文件名,但在没有指定其他名称的情况下,一些编译器(如GCC)仍然会生成名为 a.out 的可执行文件。

 (缓冲区的一个知识点)

4. 理解一切皆文件

每个设备都有对应的读写方法,都有各自的属性

打开一个设备,创建一个struct_file(内核当中的结构体,内核当中不能存在函数的实现,但存在read,write函数指针),有自己的属性,有对应的文件内核缓冲区

read函数指针,直接指向设备管理底层的设备的读方法

write函数指针,直接指向设备管理底层的设备的写方法

用户在上层通过文件描述符访问特定文件时

我们把struct file 往上统一叫做一切皆文件

一切皆文件(在系统中访问任何设备,只要提供了文件描述符,就可以不用不用关心底层硬件的差异,直接使用struct file 内部的函数指针直接对设备进行访问)

struct file 这一层我们叫做VFS(虚拟文件系统)

5. 缓冲区

提高使用者的效率

缓冲区:内存的一段空间

FILE内部包含文件描述符和文件集缓冲区

printf/fprintf/fputs/fwrits写入内容时,并不会直接到文件内核缓冲区,C语言标准库有用户级语言层缓冲区,当用户满足三个条件时(1.强制刷新 2.刷新条件满足 3.进程退出),内容再拷贝到文件内核缓冲区

刷新分为全刷新(写满缓冲区,效率最高。普通文件一般采用这种方式)和行刷新(显示器使用)

数据交给系统,交给硬件  本质全是拷贝

计算机数据流动的本质:一切皆拷贝

                             

                                                 不一样的原因是进行了行刷新了

                                                 ./a.out 行刷新是往显示器上打印

                                                 发生重定向是向文件写入,文件在磁盘

这三条消息在fork的时候还在缓冲区,fork之后父子给自退出,各自都要刷新

系统调用不存在刷新问题,库函数存在

设计libc库


http://www.ppmy.cn/server/164557.html

相关文章

Lesson 127 A famous actress

Lesson 127 A famous actress 词汇 famous a. 著名的 相关:fame n. 名誉 -ous形容词后缀:delicious         dangerous         famous 例句:他的新书很著名。    His new book is very famous. 用法:be fam…

自定义数据集使用框架的线性回归方法对其进行拟合

代码 import torch import numpy as np import torch.nn as nncriterion nn.MSELoss()data np.array([[-0.5, 7.7],[1.8, 98.5],[0.9, 57.8],[0.4, 39.2],[-1.4, -15.7],[-1.4, -37.3],[-1.8, -49.1],[1.5, 75.6],[0.4, 34.0],[0.8, 62.3]])x_data data[:, 0] y_data data…

区块链 智能合约安全 | 回滚攻击

视频教程在我主页简介和专栏里 目录: 智能合约安全 回滚攻击 总结 智能合约安全 回滚攻击 回滚攻击的本质是”耍赖” 举一个简单的例子,两个人玩石头剪刀布,输了的给对方10块钱,现在A输了,A说这把不算,重来 放在Solidity中,require()函数会检测其中的条件是否满…

UE5 蓝图计划 - Day 2-3:执行流与事件

在 Unreal Engine 5 的蓝图系统中,执行流(Execution Flow) 和 事件(Events) 是构建游戏逻辑的核心基础。通过执行流,蓝图可以按照特定的顺序运行节点逻辑;而事件则是蓝图的触发器,能…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.6 广播机制核心算法:维度扩展的数学建模

2.6 广播机制核心算法:维度扩展的数学建模 目录/提纲 #mermaid-svg-IfELXmhcsdH1tW69 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IfELXmhcsdH1tW69 .error-icon{fill:#552222;}#mermaid-svg-IfELXm…

KNIME:开源 AI 数据科学

KNIME(Konstanz Information Miner)是一款开源且功能强大的数据科学平台,由德国康斯坦茨大学的软件工程师团队开发,自2004年推出以来,广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

Flask框架基础入门教程_ezflaskapp

pip install flaskFlask 快速入门小应用 学东西,得先知道我们用这个东西,能做出来一个什么东西。 一个最小的基于flask 的应用可能看上去像下面这个样子: from flask import Flask app Flask(__name__)app.route(/) def hello_world():ret…

【高级篇 / IPv6】(7.6) ❀ 03. 宽带IPv6 - ADSL拨号宽带上网配置 ❀ FortiGate 防火墙

【简介】大部分ADSL拨号宽带都支持IPv6,这里以ADSL拨号宽带为例,演示在FortiGate防火墙上的配置方法。 准备工作 同上篇文章一样,为了兼顾不熟悉FortiGate防火墙的朋友,我们从基础操作进行演示,熟练的朋友可以跳过这一…