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

基础IO的学习

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.kler.cn/a/531050.html

相关文章:

  • IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)
  • java异常处理——try catch finally
  • 建表注意事项(2):表约束,主键自增,序列[oracle]
  • Java手写简单Merkle树
  • 关于安卓greendao打包时报错问题修复
  • 吴恩达深度学习——有效运作神经网络
  • 代码随想录-训练营-day18
  • 【go语言】grpc 快速入门
  • 30分钟入门CompletableFuture并发工具使用
  • 【漫话机器学习系列】077.范数惩罚是如何起作用的(How Norm Penalties Work)
  • mac执行brew services list时,无法连接GitHub
  • 谷歌Titans模型论文解析,Transformer迎来变革拐点——DeepSeek能否“接招”?
  • 七. Redis 当中 Jedis 的详细刨析与使用
  • 【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具03
  • 【建站】专栏目录
  • 51c视觉~CV~合集10
  • Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget
  • 运维自动化工具集:构建高效运维体系的密钥
  • 浏览器模块化难题
  • 解决vscode扩展插件开发webview中的请求跨域问题
  • 【前端】ES6模块化
  • 大模型综合性能考题汇总
  • 【PyQt】keyPressEvent键盘按压事件无响应
  • 单行函数与聚合函数
  • Windows 安装Linux子系统
  • Autosar CP RTE规范解读之RTE与VFB以及RTE API关系解析