Linux:缓冲区


我们fopen是对系统调用做封装

重定向

打开steam.cc

在这里插入图片描述

默认像标准输出打入

在这里插入图片描述

为什么输出重定向不打印标准错误 ?
因为只做了标准输出的重定向
可以分别重定向
在这里插入图片描述

那为什么要有标准错误这个fd标准错误打到显示器上呢?
因为把错误消息和常规消息进行分离,进行形成日志

我们可以追加重定向>>也可以进行2 >&1
在这里插入图片描述

进程运行要打开默认输出输入错误流,本质是fd的三个下标
在这里插入图片描述
在这里插入图片描述

引用计数,fd表
数组本质是char类型的数组,给读写位置和偏移量
刚读的位置几乎不能写,因为要改偏移量从一开始来读写。

fd是文件描述符表,来耦合进程和文件

在这里插入图片描述
在某一个files数组里有缓冲区,数据结构把它管理起来
操作系统有很多内存块4kb的,stuck_cache
file和cache被缓冲区维护起来,可以进行内存操作

file是打开文件,其他的文件名之类的属性在inode结构体里

一切皆文件

我们的一切外设都要读写,都要有各自的读写方法

listhead能把不同的进程链接起来

在这里插入图片描述

函数指针对应下层读写的方法
的、struck_file上层都是一切皆文件

因为调用的函数指针都是一样的,进程只会认为调用的file读写都是调用下层,都是一样的。

这里每一个struck_file叫做vfs 这里叫虚拟文件系统

c语言内部套函数指针是多态,VFS就是基类

在这里插入图片描述

在这里插入图片描述

访问不同文件的操作方法,被封装了

函数指针能够屏蔽底层的差异

缓冲区

缓冲区是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
缓冲区可以提高效率

在这里插入图片描述
我们加close(fd)
之后log.txt却没有

但是我们这样操作
在这里插入图片描述

这样又被写出来了

fd+系统调用如write把语层缓冲区调入操作系统的缓冲区
上面进程没退出所有缓冲区不刷新

我们也可以fflush强制刷新到操作系统
FILE* 类型又stdout stdin 本质是一个结构体指针

封装了fd 和 缓冲区指针

在这里插入图片描述

我们打开文件malloc一个 结构体空间里面有fd,缓冲区文件
最后我们写的时候拿到fd就可以直接访问文件内核缓冲区
stdin out 都是这个操作

刷新策略

1.立即刷新,无缓冲WT
2.满了,全缓冲
3.行刷新,行刷新—显示器在用(语言层)

系统调用是有成本的,频繁调系统调用会浪费效率
和vector扩容的原理类似,不能频繁的系统调用

这样我们一次性把积攒的所有语言缓冲区里的东西刷新到系统缓冲区,这样会提高效率
printf好多,好久才会调用write
我们把数据给操作系统,等同于交给硬件,一切数据流动的本质都是拷贝

缓冲区应用样例

在这里插入图片描述

在这里插入图片描述

系统调用的话,系统调用先刷新

在这里插入图片描述

这里重定向也改变了刷新策略,不是行刷新了,fork()执行的时候数据还在语言缓冲区里

作用:提高系统调用效率,提高使用者的效率
可以预加载,cin cout都可以
库可以进行缓冲区的管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值