Linux:文件管理(二)——文件缓冲区

news2024/11/25 11:09:32

目录

一、缓冲区概念

二、缓冲区刷新机制

三、用缓冲区刷新解释下面现象。


一、缓冲区概念

        缓冲区,本质就是一块内存区域。

        设计缓冲区就是为了让本来要一次一次传的数据,都暂时传到缓冲区,让缓冲区刷新一次,这样只发生了一次传递,但是却完成了很多数据的传递。


        实际上,Linux操作系统内核有缓冲区的设计,C语言也有缓冲区的设计。

  • C语言的printf语句,实际上是先将字符串输出到了C语言的缓冲区,而不是直接打印到了屏幕。
  • 当C语言的缓冲区刷新后,需要打印的内容就被刷新到了系统的缓冲区,即stdout的系统缓冲区,从而显示到屏幕上。

        具体来说。

  • 在Linux系统内核中,每个被打开的文件都对应着一个file结构体变量,即都对应着一个系统缓冲区,屏幕这个文件也对应一个系统缓冲区。
  • 在C语言层同样如此,每个被打开的文件都对应一个FILE类型结构体变量,FILE封装了文件描述符,还有C语言一层的缓冲区。
  • printf内部通过fd找到stdout这个文件,先把要输出的字符串先输出到stdout的C语言缓冲区,等待刷新,刷新stdout的C语言缓冲区到stdout的系统缓冲区,至此,屏幕上显示了结果。

 

二、缓冲区刷新机制

        C语言的缓冲区想要刷新到系统缓冲区中,可能是下面几种情况。 

  • 如果是显示器文件,则遇到\n就刷新,即行刷新。
  • 普通文件的刷新机制,写满缓冲区才刷新,即全缓冲、全刷新。
  • 调用相关接口强制刷新。
  • 进程退出,自动刷新。

三、用缓冲区刷新解释下面现象。

#include <stdio.h>
#include <unistd.h>
int main(void)
{
	//使用system call

	const char* str1 = "i am write\n";
	write(1,str1,strlen(str1));

	//使用C函数
	const char* str2 = "i am fprintf\n";
	fprintf(stdout,"%s",str2);

	const char* str3 = "i am fwrite\n";
	fwrite(str3,strlen(str3),1,stdout);
    
    //
    fork();
	return 0;
}

  • 直接运行,是将打印结果输出到屏幕,由于每句打印都有换行符,因此每一个打印语句执行完毕后,打印内容都已经刷新到了系统缓冲区。
  • 将打印结果重定向到一个普通文件时,第一个打印语句为系统调用,不需要将结果暂存到test.txt的C语言缓冲区,直接打印到了系统缓冲区。
  • 剩下两句打印都是先暂存到了C语言缓冲区。

  • fork创建出子进程。
  • 当代码全部执行完毕时,子进程开始退出,故需要刷新缓冲区,刷新缓冲区后要清空缓冲区,等于对数据做修改,因此要先做写时拷贝给子进程,于是子进程拷贝了父进程管理的test.txt的C语言缓冲区。
  • 子进程退出,刷新C语言缓冲区到test.txt的系统缓冲区,新增了两行打印。父进程退出,刷新C语言缓冲区到test.txt的系统缓冲区,也新增了两行打印。

 


        C语言的缓冲区,将多次传递集中到一次传递,提高了效率,不仅如此。要知道我们定义的变量比如int a = 12345,打印到显示器的时候,显示器解析的其实是字符,即打印了五个字符,'1' 、'2'、'3'、'4'、'5',printf之所以称为格式化打印,就是将整型变量int这样的类型格式化为显示器的字符类型,才能被显示出来,而C语言的缓冲区就是用来存储格式化后的值。

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

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

相关文章

PH热榜 | 2024-11-24

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. AutoFlow Studio 标语&#xff1a;借助简化的AI质检&#xff0c;更快发布产品&#xff0c;更聪明地进行测试。 介绍&…

hubuctf-2024校赛-复现wp

web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…

飞书会话消息左右排列

飞书会话消息左右排列 1. 飞书登录后&#xff0c;点击头像&#xff0c;弹出菜单有个按钮设置 2. 3.

《图像形态学运算全解析:原理、语法及示例展示》

简介&#xff1a; 本文详细介绍了图像形态学中的多种运算&#xff0c;包括腐蚀、膨胀、开运算、闭运算、形态学梯度运算、礼帽运算以及黑帽运算。分别阐述了各运算的原理、语法格式&#xff0c;并通过 Python 代码结合具体示例图片&#xff08;如erode.JPG、dilate.JPG、close.…

链路聚合实验

1、聚合方式 &#xff08;1&#xff09;、lacp 静态链路聚合、 动态链路聚合&#xff08;开启lacp模式&#xff0c;常用&#xff09; &#xff08;2&#xff09;、手工负载分担 静态端口聚合&#xff08;两台交换机都按照下面的命令配置&#xff09; <H3C>sys System Vi…

电子电气架构 -- ASIL D安全实现策略

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

禁止Chrome的自动升级

一、需求分析 因为用Chromeselenium做了网页自动化填写任务&#xff0c;如果Google Chrome浏览器自动升级&#xff0c;就会导致chromedriver加载失败&#xff0c;自动化任务失效&#xff0c;因此需要禁止Chrome浏览器的自动升级。 二、当前环境 三、实际配置 运行注册表编辑…

C0034.在Ubuntu中安装的Qt路径

Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录&#xff1b;

C++从零到满绩——类和对象(中)

目录 1>>前言 2>>构造函数&#xff08;我称之为初始化函数&#xff09; 3>>析构函数&#xff08;我称之为销毁函数&#xff09; 4>>拷贝构造函数&#xff08;我称之为复制函数&#xff09; 5>>运算符重载 5.2>>赋值运算符重载 ​编辑…

oracle 12c查看执行过的sql及当前正在执行的sql

V$SQL 提供了已经执行过及正在执行的SQL语句的信息。 一 查看共享池中所有sql的统计信息 #统计共享池中某类sql执行次数&#xff0c;总体执行时长&#xff0c;平均执行时长等信息&#xff0c;并按总体执行时长降序排序 SELECT INST_ID,SQL_ID,SQL_TEXT,SQL_FULLTEXT,EXECUTI…

解锁PPTist的全新体验:Windows系统环境下本地部署与远程访问

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 在Windows系统环境中&#xff0c;如何本地部署开源在线演示文稿应用PPTist&#xff0c;并实现远程访问&#xff1f;本文将为您提供详细的部署和配置指南。 P…

C语言中的指针和字符串的赋值

前言&#xff1a;温习下以前学过的C语言知识&#xff0c;温故而知新。 实例说明 本文用一段实例代码阐述指针和字符串的联系。 #include <iostream> #include <cstring> int main() {using namespace std;char animal[20] "bear";const char * bird …

Linux高阶——1117—TCP客户端服务端

目录 1、sock.h socket常用函数 网络初始化函数 首次响应函数 测试IO处理函数 获取时间函数 总代码 2、sock.c SOCKET() ACCEPT()——服务端使用这个函数等待客户端连接 CONNECT()——客户端使用这个函数连接服务端 BIND()——一般只有服务端使用 LISTEN()——服务端…

物体网格弹性变形---Unity中实现

在游戏引擎场景中的3D物体是由一定数量的点、面组成的&#xff0c;如下图&#xff1a; 要使这些物体变形就是改变3D物体每个顶点状态。 1.首先在Unity场景中增加一个球体&#xff0c;如下图 3D组件默认拥有MeshFilter、meshRenderer、Collider组件&#xff0c;分别用来获取Mes…

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)

网垃圾分类网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着全球环境保护意识的提升&#xff0c;垃圾分类已成为一项紧迫且重要的任务。为了有效推动垃圾分类的实施&#xff0c;提升公众的环保意识和参与度&#xff0c;垃圾分类已…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…

C++ 优先算法 —— 长度最小的子数组(滑动窗口)

目录 题目&#xff1a;长度最小的子数组 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 滑动窗口正确性 3. 代码实现 Ⅰ. 暴力枚举(会超时&#xff09; Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 题目&#xff1a;长…

C++设计模式——Singleton单例模式

一、单例模式的定义 单例模式&#xff0c;英文全称Singleton Pattern&#xff0c;是一种创建型设计模式&#xff0c;它保证一个类在程序中仅有一个实例&#xff0c;并对外提供一个访问的该类实例的全局接口。 单例模式通常用于需要控制对象资源的开发场景&#xff0c;一个类…

【Linux系统】—— 基本指令(三)

【Linux系统】—— 基本指令&#xff08;三&#xff09; 1 一切皆文件2 重定向操作2.1 初始重定向2.2 重定向的妙用2.3 追加重定向2.4 输入重定向2.5 一切皆文件与重定向结合 3 Linux 中的文件类型4 日志5 「more」命令6 「less」命令7 「head」与「tail」7.1 查看文件开头和结…