【Linux】文件缓冲区|理解文件系统

目录

预备知识

观察现象

第一:携带\n,不使用fork(),打印到显示器

第二:携带\n,使用fork(),打印到显示器

第三:携带\n,使用fork(),打印到文件里

第四:不携带\n,使用fork(),打印到显示器

解释现象

   携带\n,不使用fork(),打印到显示器 -- 解释

携带\n,使用fork(),打印到显示器 -- 解释

携带\n,使用fork(),打印到文件中 -- 解释


预备知识

有三种缓冲方式:全缓冲、行缓冲和无缓冲。

全缓冲(Fully Buffered):数据写入到缓冲区中,当缓冲区被填满或者达到一定条件时,才会刷新缓冲区。当内容写入到文件中时,也使用无缓冲。

行缓冲(Line Buffered):每当遇到换行符的时候,缓冲区就会刷新,将内容写入到文件中。

无缓冲(Unbuffered)数据直接刷新,写多少刷新多少。

观察现象

第一:携带\n,不使用fork(),打印到显示器

第二:携带\n,使用fork(),打印到显示器

第三:携带\n,使用fork(),打印到文件里

第四:不携带\n,使用fork(),打印到显示器

解释现象

如上图所示,C语言自己为自己提供了一个缓冲区,这个是用户级缓冲区。

操作系统在内核中也提供了一个缓冲区,这个是系统缓冲区。

为什么C语言要自己提供一个缓冲区,直接用系统的不就好了吗?

因为直接每次都进行实际的I/O操作(如磁盘读写、网络传输)可能会导致性能下降,因此引入缓冲区可以减少实际I/O操作的次数,提高程序的执行效率

具体来说:

  1. 性能优化:使用缓冲区可以减少系统调用的次数,避免频繁的I/O操作,从而提高程序的性能和效率。将数据暂时存储在缓冲区中,一次性地进行输出,比多次逐个字符地输出要更快。

  2. 灵活性:C语言为程序员提供了对缓冲区的控制权,可以手动刷新缓冲区、设置缓冲区大小等,使得程序在不同场景下能够灵活地进行优化。

  3. 错误处理:使用缓冲区可以使得程序更容易进行错误处理。在数据写入缓冲区时,程序可以检查写入是否成功、缓冲区是否溢出等,从而更好地处理可能出现的错误情况。 

   携带\n,不使用fork(),打印到显示器 -- 解释

当我们使用C语言的接口时,例如:printf/fprintf/fwrite等函数时,写入的内容会暂时放入到用户级缓冲区中。

正如之前所说,打印到显示器中时使用的是行缓冲,如果遇到\n,就会立即刷新。

所以在“携带\n,不使用fork(),打印到显示器”中时,才会C语言调用接口和系统调用接口都只打印一次。因为是行缓冲,每句语句到最后都直接刷新打印了,不会有延时。

携带\n,使用fork(),打印到显示器 -- 解释

“携带\n,使用fork(),打印到显示器”中时,C语言的接口打印一次,系统调用接口也打印一次。因为携带了\n,是行缓冲,任何一个语句写入到缓冲区,因为最后携带了\n,所以在下一个语句到缓冲区的时候,前面的会被刷新出去。所以在最后fork()的时候,子进程拷贝了父进程的数据和代码,但是父进程的缓冲区是空的,所以子进程的缓冲区也是空的,所以只打印一次。write()函数是系统调用,直接放入到系统的缓冲区,所以不受影响。

具体情况如下所示:

重定向:刷新方式发生更改,

数据写入时,由刷新改为暂存

携带\n,使用fork(),打印到文件中 -- 解释

在“携带\n,用fork(),打印到文件中”时,C式接口打印两次,系统调用接口打印一次。因为打印到文件中时,缓冲方式由行缓冲转换为全缓冲。所以父进程中就会把C式接口中的内容全部放入到C语言的缓冲区中,当使用fork的时候,子进程拷贝父进程的内容,也会拷贝父进程的缓冲区。当程序结束,要刷新缓冲区。刷新缓冲区的本质就是写入,就会发生写时拷贝,所以到系统缓冲区时,C式的接口就会打印两次,系统调用接口不受影响。

过程如图所示:

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

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

相关文章

如何选择适合的G口大流量服务器?

G口大流量服务器是指接入互联网的带宽达到1Gbps及以上,并且能够提供大量数据传输服务的服务器。那么如何选择适合的G口大流量服务器,RAK部落小编为您整理发布选择适合的G口大流量服务器需要考虑哪些关键点。 选择适合的G口大流量服务器时,应该…

JavaSec 基础之 CC1 链

文章目录 背景环境以及配置分析0x1 终点(利用点分析)0x20x30x310x320x33 0x040x05 背景 Apache Commons Collections是Apache提供的一个Java库,它扩展了Java自带的集合框架。通过这个库,咱们可以使用更多种类的集合类型,以及各种实用的集合操…

星星魔方

星星魔方 1,魔方三要素 (1)组成部件 6个中心块和8个角块和三阶魔方同构,另外每个面还有构成五角星的十个块。 (2)可执行操作 一共12种操作,其中6种是每个层顺时针旋转90度,另外6…

HTML静态网页成品作业(HTML+CSS)——家乡漳州介绍设计制作(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

Python的特性——跟老吕学Python编程

Python的特性——跟老吕学Python编程 Python的特性1.Python易学易用2.Python是解释型语言3.Python是交互式的4.Python是一种多范式语言5.Python的标准库6.Python是开源的7.Python是跨平台的8.用于GUI应用程序的Python9.Python的数据库连接10.Python是可扩展的11.Python拥有活跃…

【golang】28、用 httptest 做 web server 的 controller 的单测

文章目录 一、构建 HTTP server1.1 model.go1.2 server.go1.3 curl 验证 server 功能1.3.1 新建1.3.2 查询1.3.3 更新1.3.4 删除 二、httptest 测试2.1 完整示例2.2 实现逻辑2.3 其他示例2.4 用 TestMain 避免重复的测试代码2.5 gin 框架的 httptest 一、构建 HTTP server 1.1…

ElementUI两个小坑

1.form表单绑定的是一个对象&#xff0c;表单里的一个输入项是对象的一个属性之一&#xff0c;修改输入项&#xff0c;表单没刷新的问题&#xff0c; <el-form :model"formData" :rules"rules" ref"editForm" class"demo-ruleForm"…

蓝牙耳机链接电脑莫名奇妙关机问题(QQ浏览器)

蓝牙耳机连接电脑听歌的时候&#xff0c;如果听歌软件是暴风影音&#xff0c;或者其它播放器&#xff0c;蓝牙不会自动关机&#xff0c;但如果是QQ浏览器&#xff0c;蓝牙耳机经常莫名其妙的关机&#xff0c;时间间隔忽长忽短&#xff0c;没有规律&#xff0c;解决办法就是重启…

考研C语言复习初阶(5)

目录 一.表达式求值 1.1隐式类型转换 1.2 算术转换 12.3 操作符的属性 二. 指针是什么&#xff1f; 三 指针和指针类型 3.1 指针-整数 3.2 指针的解引用 3.3 野指针 四.指针运算 4.1 指针-整数 4.2 指针-指针 4.3 指针的关系运算 5. 指针和数组 6. 二级指针 …

202012青少年软件编程(图形化) 等级考试试卷(一级)

青少年软件编程(图形化) 等级考试试卷(一级)2020年12月 第1题:【 单选题】 下面哪个区域是“舞台区” ?( ) A:A B:B C:C D:D 【正确答案】: B 【试题解析】 : 第2题:【 单选题】 下图为小猫的初始方向, 哪个积木可以让小猫面向正右方?( ) A: B: C:…

2024.3.11 训练记录(13)

继续补题 文章目录 ICPC 2018青岛I Soldier GameICPC 2018青岛K Airdrop ICPC 2018青岛I Soldier Game 题目链接 线段树 果然稍微复杂一点的线段树就很难实现啊&#xff0c;不看题解根本没反应过来是线段树 struct Node {int l, r, lb, rb, nb, b; } tr[N * 4];其中&#x…

一个Promise全新API

1. 资讯速览 最近&#xff0c;Promise 新出了一个方法&#xff0c;已经进入 Stage 3 &#xff08;候选阶段&#xff09; &#xff0c;相信很快就能达到 Stage 4 &#xff08;完成阶段&#xff09;&#xff0c;并在项目中广泛使用。 这个方法就是 Promise.withResolvers。它是…

【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

游戏行业需要堡垒机吗?用哪款堡垒机好?

相信大家对于游戏都不陌生&#xff0c;上到老&#xff0c;下到小&#xff0c;越来越多的小伙伴开始玩游戏。随着游戏用户的增加&#xff0c;如何保障用户资料安全&#xff0c;如何确保游戏公司数据安全等是一个不容忽视的问题。因此不少人在问&#xff0c;游戏行业需要堡垒机吗…

系统设计 - SDK设计流程

▌从 0 到 1 开发 一般从 0 设计一款 SDK&#xff0c;总体上可以分为 5 个步骤&#xff1a;基础架构的设计、开放 API 接口设计、业务功能框架设计与开发、基础核心库设计与开发、打包与发布。 1. 第一步是基础架构设计&#xff0c;一个好的架构可主要从可读性、可扩展性、可维…

css3实现3D立方体旋转特效源码

源码介绍 CSS3自动旋转正方体3D特效是一款基于css3 keyframes属性制作的图片相册自动旋转立方体特效 效果展示 下载地址 css3实现3D立方体旋转特效代码

PCL点云处理之四点确定球心和半径(克拉默法则C++) (二百二十九)

PCL点云处理之四点确定球心和半径(克拉默法则C++) (二百二十九) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 相比于计算点坐标均值作为球心和某点到均值距离作为半径的快速计算法,这里介绍的方法更加适合精度要求较高的四点定球计算,下面是具体的实现代码,C++编…

搭建mysql主从复制(主主复制)

1&#xff1a;设主库允许远程连接(注意&#xff1a;设置账号密码必须使用的插件是mysql_native_password&#xff0c;其他的会连接失败) #切换到mysql这个数据库&#xff0c;修改user表中的host&#xff0c;使其可以实现远程连接 mysql>use mysql; mysql>update user se…

蓝牙系列十三:协议栈L2CAP层

L2CAP 全称为逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol)&#xff0c;位于基带层之上&#xff0c;将基带层的数据分组交换为便于高层应用的数据分组格式&#xff0c;并提供协议复用和服务质量交换等功能。 该层属于主机的内容&#xff0c;位于HCI层…

手写Mybatis自动填充插件

目录 一、Mybatis插件简介&#x1f959;二、工程创建及前期准备工作&#x1f96b;实现代码配置文件 三、插件核心代码实现&#x1f357;四、测试&#x1f953; 一、Mybatis插件简介&#x1f959; Mybatis插件运行原理及自定义插件_简述mybatis的插件运行原理,以及如何编写一个…