文件缓冲区

为什么要有文件缓冲区的存在?

假设甲在云南,甲的朋友乙在北京,甲想给乙送个东西就需要跑到北京去:这时候有菜鸟驿站了,甲就不用跑了,直接把包裹交给菜鸟驿站就可以了。缓冲区就类似于菜鸟驿站,缓冲区可以提高使用者的效率。

菜鸟不会因为你一个包裹就专门送一趟,而是一次性送大量包裹,这样可以节约成本。缓冲区也是如此,正是因为有缓冲区,才可以积累一部分在统一发送,可以提高发送的效率。

菜鸟会给不同日期的包裹分组,按组发货。缓冲区也是如此,有不同的刷新方式。

大致分为以下几种普通情况:

普通情况

1.无缓冲(立即刷新)

2.行缓冲(行刷新)

3.全缓冲(缓冲区满了,再刷新)

 特殊情况

1.菜鸟为了节约成本采用全缓冲,等仓库满了才发货,但是这样太慢了,收到了用户的投诉,要求立刻发货,这个就称之为强制刷新

2.菜鸟倒闭了,但是要在关门之前把所有仓库里的存货全部发出,这个叫做在进程结束前刷新

实验1

在实现进行之前,我们需要了解两个常识:

1.在显示器中一般采用行刷新

2.对于磁盘文件一般采用全刷新。

实验开始。

我们写一段代码,通过printf,fputs,fprintf,write,向显示器打印一些内容

#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main()
{
  fprintf(stdout,"c:hello fprintf\n");
  printf("c:hello printf\n");
  fputs("c:hello fputs\n",stdout);

  const char *str="system call:hello wirte\n";
  write(1,str,strlen(str));
  return 0;
}

fprintf和printf,fputs都为c语言接口,其中fprintf和puts都需要显式指示向哪个流输出,printf是隐式的。write是系统调用接口。

现在我们加一句代码:

我们发现一个现象,将输出重定向到log.txt之后c语言的一共打印了七次,其中c语言的调用每个都打印了两次,系统调用的接口只打印了1次。

我们都知道fork()之后父子进程共享,所以这里如果fork()在最前面,那么可以理解后面为什么每个输出都输出两次。但是这里fork()在最后面,为什么每个输出还会每个输出两次呢?

原因

因为向显示器输出是按行刷新的,文件重定向之后向log.txt文件输出,log.txt属于磁盘文件,磁盘文件是全刷新,读入的内容不足以把缓冲区写满,在执行fork的时候,缓冲区还没有满,没有刷新,执行完fork之后因为进行要结束了,即便此时不满足刷新条件,但是进程结束时还是要把缓冲区里面的内容刷新。

但是我们发现,系统调用接口并没有受影响,还是只打印了一次,因此我们可以确定,缓冲区是和操作系统没有关系的。

总结:我们日常用的缓冲区由c语言提供,和操作系统没有关系,称为语言级别缓冲区。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【vscode环境配置系列】vscode远程debug配置

VSCODE debug环境配置 插件安装配置文件debug 插件安装 安装C/C, C/C Runner 配置文件 在项目下建立.vscode文件夹&#xff0c;然后分别建立c_cpp_properties.json&#xff0c; launch.json&#xff0c;tasks.json&#xff0c;内容如下&#xff1a; c_cpp_properties.json:…

Dockerfile实战(SSH、Systemctl、Nginx、Tomcat)

目录 一、构建SSH镜像 1.1 dockerfile文件内容 1.2 生成镜像 1.3 启动容器并修改root密码 二、构建Systemctl镜像 2.1 编辑dockerfile文件 ​编辑2.2 生成镜像 2.3 启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;然后进行初始化 2.4 进入容器验证 三、…

进程的概念(2)

进程优先级 1.什么的优先级 概念&#xff1a;指定进程获取某种资源&#xff08;CPU&#xff09;的先后顺序 本质&#xff1a;优先级的本质是优先级数字的大小&#xff0c;Linux中优先级数字越小&#xff0c;优先级越高 task_struct 进程控制快-> struct -> 内部字段 -&g…

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…

测试开发 | 相比 Selenium,Web 自动化测试框架 Playwright 有哪些强大的优势?

Playwright 是由微软的研发团队所开发的一款 Web 自动化测试框架&#xff0c;这个框架具有多平台、跨语言的特点。除了基本的自动化测试能力之外&#xff0c;同时它还具备非常强大的录制功能、追踪功能。以下是 Playwright 与 Selenium 的对比。 ​ 由此可见&#xff0c;Play…

HTML5(2)

目录 一.列表、表格、表单 1.列表标签 2.表格 4.无语义的布局标签 5.字符实体 6.综合案例--1 7.综合案例--表单 一.列表、表格、表单 1.列表标签 1.1 无序列表 1.2 有序列表 1.3 定义列表 定义列表一般用于网页底部的帮助中心 2.表格 2.1 2.2 表格结构标签 shiftaltf 格…

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

简单的图像处理算法

本笔记参考crazy_Bingo 基础&#xff1a; 图像处理都是用卷积矩阵对图像卷积计算&#xff0c;如3X3 的矩阵对640 X 480分辨率的图像卷积&#xff0c;最终会得到638 X 478 的图像。卷积过程是这样的&#xff1a; 一、中值滤波 &#xff1a; 找出矩阵中的最中间值作为像素点 中…

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

数据库常考理论

1 笛卡尔积X与自然连接∞的区别 2 求候选键 3 无损连接及函数依赖 4 范式判断 笛卡尔积&#xff1a;S1*S2,产生的结果包括S1和S2的所有属性列&#xff0c;并且S1中每条记录依次和S2中所有记录 组合成一条记录&#xff0c;最终属性列为S1S2属性列&#xff0c;记录数为S1*S2记…

mamba 和conda 安装R包

**1. 下载miniconda3 ** wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh这个命令是在linux终端中输入的,miniconda3管理起来更方便。 2. 安装miniconda3 sh Miniconda3-latest-Linux-x86_64.sh接下来会有一些回车(ente…

「C++ 内存管理篇 1」C++动态内存分配

目录 〇、C语言的动态内存分配方式 一、C的动态内存分配方式 1. 什么是C的动态内存分配&#xff1f; 2. 为什么需要C的动态内存分配&#xff1f; a. new的优势 b. new的不足 c. delete的优势 d. 总结 3. 怎么使用new和delete? a. 对于内置类型 b. 对于自定义类型 c. 为什么ne…

牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2 思路 递归&#xff1a;以word第一个字符为起点&#xff0c;在矩阵中 递归搜索&#xff0c;检查是否存在完整的word路径&#xff0c; 注意恢复现场&#xff0c;又叫回溯&#…

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…

VS2022 配置OpenCV开发环境详细教程

OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel开发并首先发布于1999年。OpenCV被广泛用于实时图像处理、视频分析、物体检测、面部识别、机器人视觉以及许多其他领域。它支持C、Pytho…

Flutter应用开发-几种保存简单配置的方式

文章目录 简单配置保存的几种方式使用 shared_preferences 插件优点缺点 使用 hive 插件优点 缺点使用文件存储&#xff1a;优点缺点 简单配置保存的几种方式 在 Flutter 开发的 Android 应用中&#xff0c;保存应用配置并下次启动时读取&#xff0c;有以下几种比较合适的方式…

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

Docker | 入门:安装与配置

Docker | 入门&#xff1a;安装与配置 Docker 和传统虚拟机区别 对于传统虚拟机&#xff1a; 虚拟出一套硬件&#xff0c;运行一个完整的操作系统&#xff0c;并在这个操作系统上安装和运行软件。 对于 Docker: 将一个个容器隔离开。 容器内的应用直接运行在宿主机的内容&am…

软件模型(简洁明了)

《 软件测试基础持续更新中》 一、软件开发模型 1.1 大爆炸模型 优点&#xff1a;思路简单&#xff0c; 通常可能是开发者的“突发奇 想” 缺点&#xff1a;开发过程是非工程化的&#xff0c;随意性大&#xff0c;结果不可预知 测试&#xff1a;开发任务完成后&#xff0c;…
最新文章