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


前言

一、缓冲区

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

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语言通过封装系统调用来提供了一套方便的文件操作接口。这些接口允许用户以高级的方式(如通过文件流和缓冲区)来操作文件,而无需直接处理底层的系统调用和内存管理。


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

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

相关文章

解决PyCharm 2023 Python Packages列表为空

原因是因为没有设置镜像源 展开 > 之后,这里 点击齿轮 添加一个阿里云的源 最后还需要点击刷新 可以选择下面的任意一个国内镜像源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/…

Vue3 集成Monaco Editor编辑器

Vue3 集成Monaco Editor编辑器 1. 安装依赖2. 使用3. 效果 Monaco Editor (官方链接 https://microsoft.github.io/monaco-editor/)是一个由微软开发的功能强大的在线代码编辑器,被广泛应用于各种 Web 开发场景中。以下是对 Monaco Editor 的…

微深节能 料场堆取料无人操作系统 格雷母线

微深节能的料场堆取料无人操作系统采用了格雷母线定位系统,这是一种高精度位移检测技术,用于提升料场作业的自动化水平和精确性。该系统通过精准定位和自动化控制,大幅减少了人工操作中的误差和延误,提高了作业效率和精确性。格雷…

Jenkins入门(二):流水线方式部署多模块Springboot项目

目录 一、环境准备 1. 搭建配置Jenkins (在上一篇基础上进行) 2. 安装mysql 3. 安装redis 4. 配置docker-componse 5. 启动docker-componse 二、脚本准备 1. Jenkinsfile 2. deploy.sh 3. Dockerfile 三、Jenkins流水线配置 新增版本号参数 流水线选择代码里面的Je…

Python酷库之旅-第三方库Pandas(158)

目录 一、用法精讲 721、pandas.Timedelta.round方法 721-1、语法 721-2、参数 721-3、功能 721-4、返回值 721-5、说明 721-6、用法 721-6-1、数据准备 721-6-2、代码示例 721-6-3、结果输出 722、pandas.Timedelta.to_pytimedelta方法 722-1、语法 722-2、参数…

农作物苹果叶片病虫害识别数据集

农作物苹果叶片病虫害识别数据集 一、引言 农作物病虫害是影响农业生产的重要因素之一,其中苹果作为广泛种植的水果品种,其叶片病虫害问题尤为突出。为了有效应对苹果叶片病虫害,提高苹果产量和品质,农业科研机构和学者不断开展…

服务端负载均衡和客户端负载

负载均衡分为服务端负载均衡和客户端负载均衡,图解: 客户端的负载均衡还需要从注册中心获取集群部署的服务地址,其中客户的负载均衡器定时读取注册中心的IP和端口,然后缓存起来,这样以后可以先判断缓存IP和端口是否可用…

Java基于SSM微信小程序物流仓库管理系统设计与实现(源码+lw+数据库+讲解等)

选题背景 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

#数据结构(二)

栈和队列 一.栈的顺序存储结构 特点:先进后出 栈是一种只能在一端进行插入或删除操作的线性表。 表中允许插入删除操作的一端为栈顶(top),表的另一端为栈底(bottom), 1 结构体的定义 #incl…

10月18日

二次型矩阵要是对称矩阵 通解要带入特解 集体化 逆反思维 先定特解,再求通解 反函数...我谢谢你 依旧是原函数

Vision China 2024 | 移远通信以一体化的AI训练及部署能力,引领3C电子制造智能升级

10月14日,由机器视觉产业联盟(CMVU)主办的中国机器视觉展(Vision China)在深圳国际会展中心盛大开幕。作为全球领先的物联网整体解决方案供应商,移远通信应邀参加展会首日举办的“智造引领数质并进”3C电子制造自动化与数字化论坛。 论坛上,移…

立仪科技:光谱共焦传感器精准测量玻璃

光谱共焦测量技术作为一种创新的光学检测方法,近年来在工业领域引起了广泛关注。 它以其高精度、非接触式的特点,特别适用于透明或半透明材料如玻璃的厚度和表面形貌测量。 接下来,立仪科技小编将深入探讨光谱共焦技术在玻璃测量上的应用及其…

火山引擎数智平台 VeDI:A/B 实验互斥域流量分配体系上线

近日,火山引擎 A/B 测试平台(DataTester)完成了一次重要升级,推出互斥域流量分配体系,这一功能意味着企业在产品优化策略上有新的突破空间。此次升级的核心亮点是允许企业根据实际需求,灵活地将用户流量分割成多个独立的区块&…

探索 Jupyter 笔记本转换的无限可能:nbconvert 库的神秘面纱

文章目录 探索 Jupyter 笔记本转换的无限可能:nbconvert 库的神秘面纱背景:为何选择 nbconvert?库简介:nbconvert 是什么?安装指南:如何安装 nbconvert?函数用法:简单函数示例应用场…

简单概述Ton链开发路径

区块链开发领域发展迅速,各种平台为开发人员提供不同的生态系统。其中一个更有趣且越来越相关的区块链是TON(开放网络)区块链。TON 区块链最初由 Telegram 构思,旨在提供快速、安全且可扩展的去中心化应用程序 (dApp)。凭借其独特…

LangGraph - Hierarchical Agent Teams

本文翻译整理自 Hierarchical Agent Teams https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/ 文章目录 一、前言二、设置三、创建工具四、Helper Utilities五、定义代理 Team研究 Team文档写作Team 六、添加图层 一、前言 在前面的…

恋爱脑讲编程:Rust 的生命周期概念

从前有两个年轻人:Alice 和 Bob。他们的爱情故事有几个阶段,代表不同的生命周期。Rust 的生命周期规则在这个故事中可以形象地表现为“爱情的时间线”,其中每一段关系都有明确的起始和结束时机,避免“未定义的情感”。 第一个阶段…

学习中,师傅b站泷羽sec——xss挖掘过程

某职业技术学院网站xss挖掘: 资产归纳 例如:先把功能点都看一遍,大部分都是文章 根据信息搜集第一课学习到一般主站的防御力是比较强的,出现漏洞的点不是对新手不友好。 在资产验证过程中还是把主站看了一遍 没有发现有攻击的机会…

如何看一个flutter项目的具体flutter版本

查看pubspec.lock文件 这个项目实际运行的就是 flutter 3.16.6 版本的

试用cursor的简单的记录

快下班时又饿了,饿了几个小时了。中午那点饭,没够顶到下班。难怪店家说饭可以随便加。 所以不编码了,本周任务也超额完成了,这种状态再去编码调试,搞不好会写出自己不认识的代码。 本周工作中,新的事务是…