linux------缓冲区与C库的原理

news2024/11/20 19:35:46


前言

一、缓冲区

     缓冲区的作用是提高效率,因为将数据写入到设备,是需要调用系统接口的,如果每次写入缓冲区的数据就调用一次系统调用,涉及到系统调用这时操作系统就会介入,用户态转为内核态,这个过程需要时间,效率比较低。有了缓冲区,满足一定条件才会调用系统调用将数据统写入到操作系统而不用频繁的调用系统接口。刷新:其实就是将用户缓冲区的数据写入操作系统的过程。

1.缓冲区的刷新策略:

(1)无缓冲也就是立即刷新

(2)行缓冲(行刷新,比如显示器的文件)

(3)全缓冲(缓冲区满了,再刷新,比如磁盘上的文件)

特殊情况:

(1)强制刷新,比如c语言fllush函数

(2)进程退出时,一般要进行刷新

2.行缓冲和全缓冲

验证:

(1)行刷新,遇到\n就刷新。

   

(2)如果重定向到普通文件就是全缓冲,当写满或者强制刷新才会刷新到操作系统。

                                        

这里我们解释一下,由于缓冲区的数据属于进程,第一个程序中,是行刷新遇到\n,数据已经刷新到操作系统了,缓冲区已经清空。第二个是由于行缓冲没有遇到\n就没有刷新,缓冲区的数据还在,创建子进程,一方发生写入时就会写实拷贝,由于进程退出就会刷新,于是就打印两份。第三个是由于文件的重定向,输出定向到文件已经是全缓冲了,数据还在缓冲区中,创建子进程,一方发生写入时,写实拷贝,于是也打印了两份。

当是我们发现一个问题,这个调用系统调用(write).写入数据时,不管有没有刷新,它都是一份数据。因为这个系统调用是直接将数据写入操作系统,和进程中c语言提供的缓冲区没有任何关系。刷新的过程就是调用这个接口。

类似于这个,对于不同的文件它都有一个c语言提供的缓冲区,它们之间是互不影响。

 3.C库的原理实现:

C语言的文件的打开和关闭,读写,都是系统调用的封装。比如,c语言将输入流(stdin)和输出流(stdout),还有错误流(stderr)封装为一个结构体,C语言提供的缓冲区类似于字符数组,其实就是结构体中指向一段开辟的空间,C语言通过封装系统调用来提供了一套方便的文件操作接口。这些接口允许用户以高级的方式(如通过文件流和缓冲区)来操作文件,而无需直接处理底层的系统调用和内存管理。


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

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

相关文章

自然语言到 SQL 的曙光:我们准备好了吗?

发布于:2024 年 10 月 08 日 各位读者,国庆假期已过,我们打工人要开启奋斗新征程了,今天小编也是刚上班假期综合征还没过去,就被抓过来读论文,还好我在假期没闲着,整理了几篇关于 NL2SQL 的最新…

周易解读:两仪01

两 仪01 上一节里面,我们讲解了太极的知识。关于太极呢,它是可以有着多方面的含义。在这里呢,我们主要地,选取它的宇宙生成中的一种含义,认为太极是有所萌动,有所积累,但是呢,就是…

【YOLOv11】实战一:在LabVIEW 中使用OpenVINO实现YOLOv11

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 🎄所属专栏:『LabVIEW深度学习实战』 📑推荐文章:『LabVIEW人工智能深度学习指南』 🍻本文由virobotics(仪酷…

单体应用、SOA 和微服务架构的区别

在软件架构的发展历程中,单体应用、面向服务架构(SOA)和微服务架构都有着各自的特点和适用场景。了解它们之间的区别,有助于我们在不同的项目需求下做出更合适的架构选择。 一、单体应用 (一)定义与特点 …

DAY8 Final等

Final关键字 final修饰静态变量,这个变量今后被称为常量, 可以记住一个固定值,并且程序中不能修改了,通常这个值作为系统的配置信息。常量的名称,建议全部大写,多个单词用下划线连接。 public static final…

PaddleOCR的包装生产日期识别_随记1

一、前言 项目难点 没有训练数据图像质量层次不齐: 角度倾斜、图片模糊、光照不足、过曝等问题严重 二.、环境搭建 本任务基于Aistudio完成, 具体环境如下: 操作系统: LinuxPaddleOCR: PaddleOCR_2.7text_renderer: masterpaddlepaddle-gpu2.6.0cuda版本是11.8,…

量化投资学习

1:投资定义就是付出一定的代价,期望能够得到一定汇报,可能会出现没有回报 2:投资分析流派 2.1:宏观策略分析法:从宏观经济大方向入手,再应用到具体股票也叫自上而下的研究方法,需要理解这个趋势的核心驱动…

TS中的接口、泛型、自定义类型 与vue3的使用

泛型的使用场景: 当我们定义了一个对象时,在多次传值的过程中,其对象中的属性值被更改了,以至于后期拿不到我们需要的数据。 举个例子,当我们使用person.name时,是可以使用的。但是多次传递之后&#xff…

讯方·智汇云校华为ICT大赛赛前辅导直播安排

华为ICT大赛赛前辅导直播安排 网络赛道在“智汇云校”视频号上观看。 直播时间: 网络:2024.10.14-10.15-10.17-10.18-10.21-10.23-10.25-10.28-10.29-10.30-11.1-11.4-11.5-11.6,每晚19:30-22:00 安全:2024…

【Next.js 入门教程系列】05-数据库

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话, 给我的库点个star,关注一下吧 上一篇【Next.js 入门教程系列】04-构造 API 数据库 本篇包括以下内容: Setting up PrismaDefining data modelsCreat…

pinia学习笔记(1.0)

首先贴出官网地址:开始 | Pinia pinia作为Vue3项目中常用的状态管理工具,正逐渐取代vuex,现从0到1自己搭建pinia仓库。 首先,安装pinia,使用包管理器工具(npm,pnpm,yarn,Bun等都可以) 安装成…

QGIS如何在正射影像中获得绘制线段的长度信息||QGIS如何获取绘制点的经纬度(如何生成WKT属性)并且导出为CSV文件

QGIS如何在正射影像中获得绘制线段的长度信息 前置条件: 导入正射影像和绘制完需要计算长度的绘制线段后 1.检查菜单栏是否有数据处理(processing)按键,如果没有的话请根据以下链接打开processing工具箱:https://bl…

微服务架构 --- Nacos的项目实战操作

目录 一.什么是Nacos? 二.什么是注册中心? 1.注册中心的定义: 2.为什么需要使用注册中心? 3.注册中心原理: 三.Nacos的使用: 1.安装与启动Nacos: 2.集成 Nacos 服务注册与发现&#xff…

邀你一起共建谷歌封号申诉共享库

大家好,我是牢鹅!相信很多老粉是通过谷歌封号的三篇文章《聊聊「谷歌8.3」账号封禁解析与应对思路 》和《聊聊谷歌「高风险」封号问题解析与应对思路》、《聊聊这半年来,谷歌为何频繁封号?》关注牢鹅的,在这将近半年的…

架构设计笔记-13-层次式架构设计理论与实践

目录 知识要点 综合知识 案例分析 1.SSM框架 2.MVC模式,XML 3.MVC架构脆弱性 4.容器技术的优势 5.对象关系映射ORM技术 知识要点 一般来说,架构可以分为表现层、中间层和持久层三个层次。 表现层:表现层主要负责接收用户的请求&…

【论文翻译】TITAN:用于交通流量预测的异构专家混合模型

题目A TIME SERIES IS WORTH FIVE EXPERTS: HETEROGENEOUS MIXTURE OF EXPERTS FOR TRAFFIC FLOW PREDICTION论文链接https://arxiv.org/pdf/2409.17440源码地址https://github.com/sqlcow/TITAN(作者说论文被接受后,代码将更新) 摘要 准确的…

API项目4:开发SDK

面临另一个问题 作为开发者,每次调用接口都需要自己生成时间戳,编写签名算法,生成随机数等等,这些都是相当繁琐的工作。 因此,要想办法让开发者能够以最简单的方式调用接口。开发者只需要关心传递哪些参数以及他们的…

如何通过计算巢在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具,专为开发者构建定制的语言学习模型(LLM)应用而设计。 通过其拖放式界面,用户可以轻松创建和管理AI驱动的交互式应用,如聊天机器人和数据分析工具。 它基于Lang…

网站分享 | 六个插件搜索下载网站

网站分享: 今天分享几个搜索插件的网站。 🔧 Chrome Web Store —— 官方插件库,选择最多 谷歌官方的 Chrome 插件商店,拥有丰富的插件供你选择。无论你是办公党、学生党,还是娱乐爱好者,这里都能找到提…

第 4 章:Vue 中的 ajax

1. 解决开发环境 Ajax 跨域问题 vue脚手架配置代理 原理图: 1.1 方法一 在vue.config.js中添加如下配置: devServer:{proxy:"http://localhost:5000" // 这个5000 是请求目标的端口号 }说明: 优点:配置简单&…