首页 > 系统相关 >[Linux]文件缓冲区

[Linux]文件缓冲区

时间:2024-03-19 22:33:12浏览次数:20  
标签:文件 调用 Linux 系统 C语言 显示器 刷新 缓冲区

文件fd

  • 输出重定向除了用dup2()改变数组下标外,还可以用命令来完成在这里插入图片描述

所有的命令执行,都必须有操作系统将其运行起来变成进程,然后根据>>, <<来判断是输入重定向,还是输出重定向。

缓冲区

  • 之所以有缓冲区,是为了提高效率的。就类比快递一样,如果你送一个东西给北京的朋友,那么你自己过去给他,成本太大了,所以有快递之后,你只需要将你要送的东西,给快递,那么之后的事就不用你来管了,快递公司会帮我寄到指定的地点。缓冲区也是如此
  • 我们把从缓冲区里的数据拷贝到指定区域,这个过程叫刷新
  • 缓冲区的本质就是一块内存区域,作用是来提高效率,其实就是用空间换时间。

在这里插入图片描述

  • 我们所说的缓冲区其实跟内核中的缓冲区是没有关联的,尽管内核中确实有,我们所说的只是语言层面的缓冲区比如C语言自带的缓冲区

为什么要在语言层面设置一个缓冲区

  • 我们要明白,调用系统调用是有成本的,是消耗时间的。所以说在语言层面设置一个缓冲区,可以有效地减少我们调用系统调用的次数。也就是说我们在使用fwrite函数的时候,fwrite并不是直接使用write的系统调用,而是先向语言的缓冲区写入,等缓冲区满后,再调用write,写到系统的缓冲区中。
  • 语言层面的缓冲区有三种刷新方式:
    1. 无刷新,无缓冲
    1. 行刷新,比如显示器,
    1. 全刷新,全缓冲。对于普通文件而言,只有把缓冲区写满,才会调用系统调用,写入系统内部。至于从系统缓冲区写入到磁盘的这个过程,则是由操作系统决定的。
  • 除了上面的三个默认的刷新方式,还有两种刷新方式,分别是强制刷新和进程退出的时候自动刷新。

缓冲区在C语言的什么位置呢

int main()
{
    FILE* fp = fopen("log.txt", 'w');
    return 0;
}
  • 如上代码所示,在我们每次打开文件的时候,都会用一个FILE*指针来接收,其实FILE是一个结构体,里面集成了缓冲区,还有文件描述符fd

  • 在这里插入图片描述

  • 对于上述代码所呈现出来的现象,是因为当我们向显示器进行打印时,采用的刷新方案是行刷新,意味着在fork()之前,C语言缓冲区的内容就已经被刷新到系统缓冲区中了,所以无论是使用系统调用还是C语言的函数,都只是把C语言缓冲区刷新一次到系统缓冲区中。但是向文件进行打印时,采用的刷新方式是全缓冲,也就是在fork()之前的C语言函数调用,实现的都只是向C语言的缓冲区进行打印,在fork()之后又创建了一个子进程,与父进程的状态是一样的,缓冲区中依旧有由于C语言函数调用而存在的数据,当进程结束时,两个相同内容的缓冲区都会由于进程的关闭而进行自动刷新,也就会向系统缓冲区中刷新两次。

int main()
{
    int a = 100;
    printf("%d", a);
    scanf("%d", &a);
    return 0;
}
  • 缓冲区除了提高效率的作用,还起到格式化的作用,如上代码所示,当我们使用printf()函数时,将变量a打印到显示器上,但是显示器是字符设备,所以是把整形变量变成字符形式,送到缓冲区上,然后再打印到显示器上。当我们使用scanf()函数时,从键盘读取数据到变量a中,但是a是整形,所以先从键盘读取数据到缓冲区,然后变成整形,再传给变量a。

标签:文件,调用,Linux,系统,C语言,显示器,刷新,缓冲区
From: https://blog.csdn.net/qq_63106808/article/details/136857440

相关文章

  • node实现目标文件移动到自建文件中
    constfs=require('fs');constpath=require('path');constoutputDirectory='result';//替换成你的目标文件夹路径if(!fs.existsSync(outputDirectory)){  fs.mkdirSync(outputDirectory)}//根目录,包含多个文件夹constrootDirectory='测试文......
  • node实现将大CSV文件拆分小CSV
    constfs=require('fs');constreadline=require('readline');//定义输入文件的路径和输出文件的目录constinputFilePath='大的CSV文件.csv';constoutputDirectory='result'; //每个小文件包含的行数constlinesPerFile=250000;//创建输出目录if(......
  • VisualStudio(2022)- 打包项目文件为.exe安装包
    VisualStudio(2022)-打包项目文件为.exe安装包使用VisualStudio软件(2022)将项目文件为打包为.exe安装包步骤详解(保姆级教程) 前言:使用扩展:installProjects 注意事项:打包项目前,确保项目能正常运行,不然打包毫无意义。 一、安装扩展打开vs软件->扩展->管理扩展->搜索i......
  • 操作系统实验-与文件读写有关的系统调用函数用法
    1、open函数点击查看代码#include<fcntl.h>//头文件intopen(constchar*pathname,intflags,mode_tmode);pathname:要打开文件的路径名;flags:用于指定文件的打开方式和行为,以下是一些常见的标志,都通过宏进行了定义;O_RDONLY:只读方式打开文件。O_WRONLY:只写方式打......
  • 常用开发工具系统环境变量及配置文件
    环境变量EnvironmentVariables用户变量IntelliJIDEAC:\Developer\JetBrains\IntelliJIDEA2021.2.1\bin;Path%IntelliJIDEA%系统变量TomcatCATALINA_BASEC:\Developer\Tomcat\tomcat64-9.0.65CATALINA_HOMEC:\Developer\Tomca......
  • Go 文件操作-读写文件
    Go文件操作-读写文件Go读取文件整个文件读取进内存(适合读小文件)1.直接指定文件名读取os.ReadFile()ioutil.ReadFile()(在Go1.16开始,ioutil.ReadFile()就等价于os.ReadFile())packagemainimport( "fmt" "os")funcmain(){ bytes,err:=os.ReadFile(".......
  • Solon Web 文件上传的最佳实践
    文件上传是Web开发中最常见的一个应用场景。一般在处理数据时,会有两种常见的方案:直接把文件流放在内存里,或者把文件流先缓冲到磁盘。1、如果是高频且文件极小使用纯内存模式,默认即可。如果高频小文件,是不适合用“临时文件模式”的,磁盘可能容易刷坏。只能多配些内存!2、如果是......
  • 'vue' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决方法
    查看信息npmconfiglist根据prefix路径,查看是否有'vue.cmd'文件参考了这篇感觉很整齐如果没有就安装vuenpminstall-gvue再安装脚手架vue-cli//安装npminstall-g@vue/cli//或者cnpminstall-g@vue/cli//或者yarnglobaladd@vue/cli然后配置环境变......
  • snownlp的原始评论文件直方图分析
    SnowNLP是一个专门为处理中文文本而创建的Python自然语言处理库。它是由isnowfy开发并在GitHub上开源的一个项目,地址为 https://github.com/isnowfy/snownlp 。SnowNLP受TextBlob库的启发,但针对中文文本处理的特点进行了定制化设计,并且没有依赖NLTK(NaturalLanguage......
  • zip文件
    zip文件的格式压缩源文件数据区504B0304压缩源目录数据区504B0102目录结束标志504B0506伪加密和真加密的区别真加密zip文件(压缩源文件数据区的全局方式位标志和压缩源目录区的全局方式位标志都不是0000,一般是0900) 伪加密zip文件(只有在压缩源目录数据区的全局方式......