Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识,下面我们将介绍缓冲区的相关知识。

本质上来说,缓冲区就是一块内存区域,因为内核上的缓冲区较复杂,所以本文主要介绍C语言的缓冲区。

目录

1.为什么要有缓冲区

2.应用层缓冲区的默认刷新策略

3.如何证明缓冲区的存在?


1.为什么要有缓冲区

缓冲区的存在就是为了提高使用者的效率,我们可以以物流公司为例,如果每次物流公司送快递都一件一件送,那么效率就会变得非常底下,所以在日常生活中物流公司都是等到货物积攒到一定数量时再进行发送。同理,缓冲区的存在就相当于物流公司,缓冲区能够聚集数据,在需要时一次拷贝,提高整体的效率。拷贝的一次就叫刷新。                                                                                  

在正式介绍缓冲区前,我们需要知道的是,我们常说的缓冲区和内核中的缓冲区没有关系,我们常说的缓冲区是语言层面的缓冲区,我们熟知的C语言就自带缓冲区。因为调用系统调用是有成本的,所以我们在语言层面上创建了缓冲区,这样就不会造成我们输入一次就调用相关的系统调用向内核写入一次,而是等到数据量足够多时,再调用系统调用接口,向内核中写入。 这样就避免了频繁调用系统调用,减少了系统开销。                                                                                

2.应用层缓冲区的默认刷新策略

<1>无刷新,无缓冲

<2>行刷新,遇到\n时就刷新

<3>全缓冲,全部刷新 -- 普通文件里面,缓冲区写满才刷新。

当然,我们也可以通过强制刷新函数fflush,直接刷新缓冲区。在进程退出时,缓冲区也会刷新。

 缓冲区被谁维护?

前面我们了解到FILE其实是一个结构体,里面不仅仅封装了fd,还封装了其他的内容,其中就包括了文件缓冲区,并且每一个文件都包含一个缓冲区。所以我们在实施写入文件操作函数时,都要传递一个FILE*的指针,其实我们写入内容时,就是将我们所写的内容拷贝到FILE* 的指针里面维护的缓冲区,                       

3.如何证明缓冲区的存在?

下面为了验证缓冲区的存在,我们先通过一段代码来验证。

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>#define filename "file.txt"
int main()
{//使用系统调用const char* str = "hello world\n";write(1,str,strlen(str));//使用C语言的相关接口const char* str1 = "hello fwrite\n";fwrite(str1,strlen(str1),1,stdout);const char* str2 = "hello fprintf\n";fprintf(stdout,"%s",str2);fork();return 0;}

正常执行结果

 

将执行结果重定向到文件里面的结果

我们可以发现向显示器打印,只会打印三条语句,这是因为刷新策略是行刷新,而这也符合我们的认知。而我们实行重定向时,对log.txt这个普通文件的刷新策略就变成了全缓冲,此时C语言的缓冲区就存放了两条语句“hello fwrite\n” 和 “hello fprintf\n”。因为这里我们使用了fork创建了子进程,所以这里就存在了两个进程。而前面我们提到过,当进程退出时,缓冲区会被强制地刷新。这里无论哪个进程先退出,缓冲区都会被刷新两次,将缓冲区保存地数据拷贝到操作系统。正常来说缓冲区的刷新会导致缓冲区内容清空,但是因为写时拷贝的存在,所以才会造成刷新两次相同的数据。而系统调用打印的数据只有一次的原因是系统调用写入数据是直接写入操作系统,一旦数据写入操作系统,数据就和进程无关了。

通过对上述内容的了解,我们可以回顾一下printf和scanf函数,scanf又叫格式化输入,printf叫格式化输出。键盘和显示器都是字符设备,其实我们无论是从显示器还是键盘上输入时,都是以字符的方式进行的。但是我们可以通过这两个函数从缓冲区读取或输出数据,并格式化成对应的数据类型。

以上就是全部内容,文章如有不对之处,还望各位大佬指正,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在bud里弄3d模型?---模大狮模型网

随着数字化设计的不断发展&#xff0c;越来越多的设计软件提供了对3D模型的支持&#xff0c;为设计师们带来了更广阔的创作空间。Bud作为一款功能强大的设计工具&#xff0c;也提供了添加和编辑3D模型的功能&#xff0c;让用户能够更加灵活地进行设计创作。本文将为您详细介绍如…

Python实战开发及案例分析(16)—— 遗传算法

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种模拟自然选择和遗传学原理的搜索启发式算法。它们通常用于解决优化和搜索问题&#xff0c;基于“适者生存”的自然选择概念&#xff0c;通过选择、交叉&#xff08;杂交&#xff09;、变异操作在一系列迭代中逐步优…

01-背包

此为本蒟蒻第n次发文,若有错误或不足之处,还请各位牛犇多多指出。 目录 引入 01背包 时间复杂度 O ( n 2 ) O(n^2) O(n2) 空间复杂度 O ( n 2 ) O(n^2) O(n2) 代码 滚动数组优化 空间复杂度 O ( n ) O(n) O(n) 代码 练习与拓展 资源来源与参考 0. 引入 在正式开始讲『01背…

【计算机网络】计算机网络体系结构

&#x1f6a9;本文已收录至专栏&#xff1a;计算机网络学习之旅 一.常见的三种结构 (1) OSI参考模型 为了使不同体系结构的计算机网络都能互连起来&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;提出了著名的开放系统互连基本参考模型&#xff0c…

pycharm 将项目连同库一起打包及虚拟环境的使用

目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后&#xff0c;启动终端(Alt F12)&#xff0c;或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档&#xff0c;便于…

李宏毅-注意力机制详解

原视频链接&#xff1a;attention 一. 基本问题分析 1. 模型的input 无论是预测视频观看人数还是图像处理&#xff0c;输入都可以看作是一个向量&#xff0c;输出是一个数值或类别。然而&#xff0c;若输入是一系列向量&#xff0c;长度可能会不同&#xff0c;例如把句子里的…

Spring STOMP-消息处理流程

一旦STOMP的接口被公布&#xff0c;Spring应用程序就成为连接客户端的STOMP代理。本节描述服务端消息处理的流程。 spring-messaging模块包含消息类应用的基础功能&#xff0c;这些功能起源于Spring Integration项目。并且&#xff0c;后来被提取整合到Spring框架&#xff0c;…

LeetCode - 0001 两数之和

题目地址&#xff1a;https://leetcode.cn/problems/two-sum/description/ 我&#xff1a;你好&#xff0c;面试官&#xff0c;我对算法了解的不多&#xff0c;只刷过LeetCode第一题&#xff0c;你不要问的太难了&#xff0c;好&#xff0c;我准备好了。 面试官&#xff1a;啊…

Spring Boot 调用外部接口的几种方式

Spring Boot 调用外部接口的几种方式 在微服务架构中&#xff0c;服务间的调用是不可或缺的环节。Spring Boot 为开发者提供了多种方式来实现这一任务&#xff0c;这个文章将为你详细介绍这些方式。 一、使用RestTemplate RestTemplate是 Spring Boot 早期版本中常用的 REST 客…

十个最适合论文写作的GPTs及其应用

文章目录 一、GPTs让一切皆有可能二、最适合论文写作的GPTs及其应用1、[Paper Search Engine](https://chat.openai.com/g/g-9v5gHG9Bo)2、[Academic Paper Specialist&#xff08;学术论文撰写专家&#xff09;](https://chat.openai.com/g/g-jryw3pfsH)3、[Paper Connect 论文…

【八十七】【算法分析与设计】单调栈全新版本,右大于,左小于右小于等于,739. 每日温度,907. 子数组的最小值之和

739. 每日温度(右大于) 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示…

微信公众号接入chatGPT自动回复(2)

微信公众平台 配置自动回复的服务器 application.properties中的配置 验证服务器接口配置 其实就两个接口(相同的url地址,只不过请求方式不一样) 1.验证接口(get请求) 2.自动回复接口(post请求) 完整代码 这个地址就是上面URL配置的地址 如果使用Nginx的话自动配置 将该代…

[原创](Modern C++)现代C++的字符串与Windows API交互的正确方式.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

@PostConstruct

PostConstruct initializeBean方法–> PostProcessor.postProcessMergedBeanDefinition --> InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction 被PostConstruct注解的方法会在Bean初始化的时候被调用&#xff0c;如下图&#xff1a; 继承关系如下…

jenkins连接ubuntu普通用户节点

1.创建credentials 2.创建node 3.在jenkins服务器还需要进行的操作&#xff08;jenkins服务器中&#xff09; mkdir /var/lib/jenkins/.ssh ssh-keyscan -H 192.168.110.204 >> /var/lib/jenkins/.ssh/known_hosts chown -R jenkins:jenkins /var/lib/jenkins/.ssh/ 4.…

相交链表(数据结构)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 解决思路 1&#xff0c;找到相交的点 相交链表的关键也就是找到相交的点&#xff0c;所以我们需要首先判断有没有相交的节点&#…

程序员必读书籍推荐

在快速发展的编程领域&#xff0c;不断学习和积累是每位程序员的必修课。以下是几本对于程序员来说&#xff0c;不容错过的必读书籍。 《代码大全》是一本编程界的经典之作&#xff0c;书中不仅详细介绍了编程的最佳实践&#xff0c;还深入探讨了软件构建的艺术。对于想要提升…

最新的云渲染100活动有哪些?渲染100邀请码1a12

随着科技的进步&#xff0c;云渲染已经成为设计行业的必备工具&#xff0c;各个云渲染平台为了吸引用户也推出各种各样的活动&#xff0c;今天我们以广受好评的渲染100为例&#xff0c;来说下它们的活动体系。 1、新用户活动 渲染100对新用户很友好&#xff0c;提供了充足的测…