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

news2024/11/16 9:57:10

目录

预备知识

观察现象

第一:携带\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.coloradmin.cn/o/1510075.html

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

相关文章

【R语言实战】——金融时序分布拟合

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

常见的限流算法- python版本

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 在系统的稳定性设计中,需要考虑到的就是限流,避免高并发…

DC/DC高压模块直流升压可调稳压输出升压变换器5V12V24V48V转50V110V150V130V200V250V300V450V500V600V800V

特点 效率高达 80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~85℃阻燃封装,满足UL94-V0 要求温度特性好可直接焊在PCB 上 应用 HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9~18V、及18~36V、…

容量治理三板斧:扩容、限流与降级

前言 随着现代软件系统日益复杂和用户规模的不断增长,分布式架构成为了保持系统高可用性与高性能的标准解决方案。然而,随之而来的是对系统容量治理的新挑战。在这样的背景下,容量治理成为了分布式系统设计和运维中不可或缺的一环。要确保系…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论一】

简介: 2014年Ian Goodfellow提出以来,GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN依靠的是对…

AI毕业设计生成器(基于AI大模型技术开发)支持Java和Python

这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型。基本实现了计算机毕业设计生成器,能够初步生成Java或python基本源码。…

嵌入式驱动学习第三周——container_of()宏

前言 Linux内核编程中,会经常看见一个宏函数container_of,那么这究竟是什么呢,本篇博客记录学习container_of的过程。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes,将调用缓存的数据,速度比较快result_type:[json,xml,serialize,var_export]返回数据格式,默认为jsonl…

【JavaScript 漫游】【034】AJAX

文章简介 本篇文章为【JavaScript 漫游】专栏的第 034 篇文章,对浏览器模型的 XMLHttpRequest 对象(AJAX)的知识点进行了总结。 XMLHttpRequest 对象概述 浏览器与服务器之间,采用 HTTP 协议通信。用户在浏览器地址栏键入一个网…

Cisco Packet Tracer模拟器实现交换机的vlan配置、生成树技术及模拟器路由设置

1. 内容 1.对交换机进行Vlan配置,完成交换机Vlan的划分、交换机间相同Vlan的通信以及三层交换机的配置。 2.实现交换机的生成树技术,在两个交换机上配置生成树协议,实现Vlan的负载均衡 3.对路由器进行设置,包括模拟器中路由器的…

案例分析篇07:数据库设计相关28个考点(23~28)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

基于yolov5的草莓成熟度检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于yolov5的草莓成熟度检测系统,系统既能够实现图像检测,也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili (一)简介 基于yolov5的草莓成熟度系统是在pytorch框架下实现的,这是一个完整的项目…

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历,每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n);其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh);其…

虚位以待!OpenHarmony开发者激励计划持续招募中

虚位以待!OpenHarmony开发者激励计划持续招募中 自2022年5月7日,OpenHarmony开发者激励计划启动招募以来,就正式公开邀请广大开发者们参与 OpenHarmony 生态共建。随着社区的快速成长,目前已有累计超过7000名贡献者,产…

7个帮您恢复文件的Android 数据恢复推荐

您的 Android 设备上保存哪些类型的数据?如果您像大多数人一样,那么您可能已经列出了文档、照片、视频和音频文件。如果您使用智能手机或平板电脑的时间足够长,我们愿意打赌您对 Android 数据丢失有第一手经验。 对您来说幸运的是&#xff0…

目标检测数据集:手机顶盖焊缺陷检测数据集

✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的数据集会在该…

ubuntu 18.04安装教程(详细有效)

文章目录 一、下载ubuntu 18.04镜像二、安装ubuntu1. 点击下载好的Vmware Workstation,点击新建虚拟机,选择 “自定义(高级)”,之后下一步。2. 默认配置,不需要更改,点击下一步。3. 选择 “安装程序光盘映像文件(iso)(…

用信号的方式回收僵尸进程

当子进程退出后,会给父进程发送一个17号SIGCHLD信号,父进程接收到17号信号后,进入信号处理函数调用waitpid函数回收僵尸进程若多个子进程同时退出后,这是切回到父进程,此时父进程只会处理一个17号信号,其他…

vulhub中Weblogic SSRF漏洞复现

Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。 访问http://your-ip:7001/uddiexplorer/,无需登录即可查看uddiexplorer应用。 SSRF漏洞测试 SSRF漏洞存在于http://your-ip:7001/ud…

魅族录屏功能在哪里?这篇文章告诉你答案

“魅族录屏功能在哪里?作为一名魅族手机的新用户,我对这款手机非常满意。然而,最近我在工作中需要用到录屏功能,却找不到如何开启的方法。想请教各位魅族手机的达人们,能否分享一下录屏功能的开启方法?非常…