【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,一经查实,立即删除!

相关文章

Android Studio

深入探索集成开发环境的魅力 在数字化和移动化的浪潮下,Android系统凭借其广泛的覆盖范围和深度的定制性,已在全球范围内占据显著的市场份额。为了支撑这一庞大的生态系统,一个强大且灵活的集成开发环境(IDE)应运而生…

如何选择适合的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;解决办法就是重启…

翻硬币..

0翻硬币 - 蓝桥云课 (lanqiao.cn) 题目描述 小明正在玩一个"翻硬币”的游戏 桌上放着排成一排的若干硬币。我们用”表示正面&#xff0c;用o表示反面(是小写字母&#xff0c;不是零) 比如&#xff0c;可能情形是:**oo***o00 如果同时翻转左边的两个硬币&#xff0c;则变为…

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

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

matlab中设置坐标轴范围和刻度 xlim/xtick/xticklable

set(gca,XLim,[0 10]);%X轴的数据显示范围 set(gca,XTick,[0:1:10]);%设置要显示坐标刻度 set(gca,XTickLabel,[0:1:10]);%给坐标加标签 y轴同理

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;不知道各位的…

目标检测YOLO实战应用案例100讲-基于改进YOLOv4模型的道路多目标检测

目录 前言 国内外研究现状 现有研究存在的主要不足 2 基础理论综述

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

相信大家对于游戏都不陌生&#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立方体旋转特效代码