【Linux基础IO】深入理解缓冲区

缓冲区在文件操作的过程中是比较重要的,理解缓冲区向文件刷新内容的原理可以更好的帮助我们更深层的理解操作系统内核对文件的操作。

FILE

因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过文件描述符fd访问的。所以C库当中的FILE结构体内部必定封装了文件描述符fd。

bff8a8624f4543188f72a787a76fbbbf.png

缓冲区分析

2943da57885e41e1a3d6ba3297973942.png

刷新方式

刷新指的是:将用户级缓冲区里的内容刷新到内核级缓冲区里。

1.无缓冲 ----- 直接刷新

2.行缓冲 ----- 遇到\n刷新(向显示器文件写入内容)

3.全缓冲 ----- 用户级缓冲区满了才刷新(向普通文件里写入内容)

进程退出时也会刷新

 向显示器文件写入内容的过程:

当我们调用对文件写操作c库函数(printf、fprintf,fwrite)向显示器文件写入内容,首先是将内容写到FILE的c提供的缓冲区里,刷新方式采取2.遇到\n刷新,我们调用的c库函数就会调用它封装的write,write根据FILE里的fd在内核中找到对应的文件结构体对象里指针指向的缓冲区里;当我们调用系统调用write时,write将内容直接写到被写入文件结构体对应的内核缓冲区里,然后由操作系统将内容传送到磁盘。

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main(){const char* str ="linux";const char* str1 = "OS";//库函数fprintf(stdout, "hello");fwrite(str, strlen(str), 1, stdout);//系统调用write(1, str1, strlen(str1));                                                                                                                        close(1);                                                                                                                                return 0;                                                                                                                                }

4155da52c50b4030a0e6419cc03b0f82.png

 可以看到close了fd=1的文件(即显示器文件),库函数fprintf、fwrite函数和系统调用write里的要向显示器文件输入的字符串末尾都无\n,但是为什么只有系统调用向显示器文件成功写入了字符串呢?这是因为c库对文件操作函数内部提供了缓冲区。另外,我们这里所说的缓冲区, 都是用户级缓冲区。write系统调用将要写入显示器文件的内容直接写到内核级缓冲区,因此可以打印出write写入的内容;c库函数由于要等到进程退出才可以将内容从用户级缓冲区刷新到内核级缓冲区,但在进程退出前,调用了close(1),关闭了显示器文件,因此显示器文件结构体对应的内核级缓冲区被关闭了,无法向里面刷新内容,也就无法将内容写入到磁盘里的显示器文件。如果要写入的字符串末尾都加了\n(刷新方式为)那么就全部会被写入到显示器文件里,并由显示器打印出来。

2f132490329d4dfbb842f78643479d4f.png

向普通文件写入内容的过程:

过程和向显示器文件写入内容一样,刷新方式采取3.全缓冲。

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main(){const char* str ="linux";const char* str1 = "OS";//库函数fprintf(stdout, "hello");fwrite(str, strlen(str), 1, stdout);//系统调用write(1, str1, strlen(str1));                                                                                                                        fork();                                                                                                                                return 0;                                                                                                                                }

f8623a0f44ca4bc8968fcf2d618aa55d.png

为什么c库函数写入的内容写入到text.txt了两遍?

调用库函数向文件text.txt写入文件时刷新方式为3.全缓冲,也就是说只有进程退出时才可以刷新,因为fork()创建了子进程,向内核缓冲区刷新内容时,子进程的内核缓冲区内存空间发生写时拷贝。

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

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

相关文章

强化学习专题:强化学习知识梳理(一)

2024/6/23&#xff1a; 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别&#xff08;在线 or 离线&#xff09; 首先&#xff0c;一切的开始是强化学习中时序差分方程&#xff0c;这体现了强化学习方法的优化策略。在…

LED热管理

LED照明系统的热管理 本文提供了用于LED灯具的热管理系统。 包含LED轨道灯具包括照明组件、安装到照明组件上并具有多个孔的夹具壳体&#xff0c;以及将夹具壳体固定到轨道上的安装结构。 照明组件包括具有多个翅片的散热器、安装在所述散热器上的反射器、支撑在所述散热器上…

怎么用Python接口发送推广短信

群发短信平台推广&#xff0c;有不少优点。其中通过正规106运营商平台推送&#xff0c;信息更加正规性。尤其是对接接口短信&#xff0c;比如验证码之类的&#xff0c;个人手机号码下发的验证码一般都不靠谱。 支持点对点一对一群发&#xff0c;方便工资条、物业通知等变量信息…

spring-注解开发

注解开发定义bean XML配置比对注解配置

068、PyCharm 关于Live Template模板

在 PyCharm 编辑器中&#xff0c;Live Templates 是一种功能强大的工具&#xff0c;可以帮助我们快速插入常用的代码片段或模板。 以下是在 PyCharm 中添加 Live Templates 的步骤&#xff1a; 添加 Live Templates 步骤&#xff1a; 打开 PyCharm 编辑器。 转到菜单栏中的 …

P2实验室装修标准都有哪些

P2实验室&#xff08;也称为生物安全二级实验室&#xff0c;BSL-2实验室&#xff09;的装修标准需要满足一系列的设计和施工要求&#xff0c;以确保实验室的安全性和功能性。因此&#xff0c;P2实验室装修标准不仅要满足一般实验室的要求&#xff0c;还需符合生物安全的特殊规定…

Pycharm 启动 Django项目 —— python篇

1、打开你的工程&#xff0c;在菜单栏里找到Run-->Edit Configurations 2、在打开的对话框里边选择Python&#xff0c;点击号 3.选择Python 4.出现了一个新的项Unnamed&#xff0c;你可以把它改名叫debug&#xff0c;好听一点 5.脚本选择你网站的manage.py&#xff0c;脚本参…

民生银行北京分行金融科技校招面试记录

本文介绍2024届春招中&#xff0c;中国民生银行下属北京分行的金融科技岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国民生银行下属北京分行的金融科技岗位&#xff0c;暂时不清楚所在部门。目前完成了一面与终面&#xff0c;在这里记录一下面试的相关经历。 首先&…

仓库管理系统04--创建业务逻辑

1、添加业务逻辑类 然后依次添加其他的类 2、创建所有DB操作的接口类 3、业务逻辑实现接口类 实现接口的客户类方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq;namespace…

Typora—适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器

Typora 是一款适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器&#xff0c;它以其简洁易用的界面和强大的功能受到了众多用户的喜爱。 首先&#xff0c;Typora 的界面设计非常简洁直观&#xff0c;没有过多繁杂的菜单和按钮&#xff0c;让用户能够专注于写作本身。它采用实时…

React 19 新特性集合

前言&#xff1a;https://juejin.cn/post/7337207433868197915 新 React 版本信息 伴随 React v19 Beta 的发布&#xff0c;React v18.3 也一并发布。 React v18.3相比最后一个 React v18 的版本 v18.2 &#xff0c;v18.3 添加了一些警告提示&#xff0c;便于尽早发现问题&a…

6.25C高级

终端输入两个数&#xff0c;判断两数是否相等&#xff0c;如果不相等&#xff0c;判断大小关系 #!/bin/bash if [ $1 -eq $2 ] thenecho $1$2 elif [ $1 -gt $2 ] thenecho "$1>$2" elseecho "$1<$2" fi 2.已知网址www.hqyj.com&#xff0c;使用e…

CS-流量通讯特征修改-端口store证书流量通讯规则

免责声明:本文仅做技术交流与学习... 目录 1.修改默认端口&#xff1a; 2.去除store证书特征&#xff1a; 查看证书指纹&#xff1a; 生成证书指纹&#xff1a; 应用证书指纹&#xff1a; 3.去除流量通讯特征&#xff1a; 规则资源 http流量特征修改: https流量特征修改:…

什么是Vue开发技术

概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它设计得非常灵活&#xff0c;可以轻松地被集成到任何项目中。 vue是视图的发音&#xff0c;其目的是帮助开发者易于上手&#xff0c;提供强大的功能构建复杂的应用程序 示例 以下是vue基本的语法概述 声明式渲…

DWG转PDF字体研究记录

1.前言 最近需要对PDF中的符合业务规则的文字进行提取&#xff0c;发现有些文字不是文字信息形式存储&#xff0c;而是polyline形式表达&#xff0c;意味着仅仅有形体上的表达&#xff0c;丢失了原本的文字信息。 经过沟通得知&#xff0c;这些PDF是AutoCAD软件导出的&#xf…

生产环境安装odoo

odoo可以在多平台运行&#xff0c;但是在生产环境下官方不建议在Windows平台部署。在Windows下可能不能很好的支持一服务多worker的形式&#xff0c;更推荐在Linux下部署。 常见的Linux如Ubuntu、Debian等Debian系或Redhat系都能执行官网的包安装。 地址&#xff1a;Download |…

Linux集群自动化维护-Ansible

1.1Ansible概述 自动化运维&#xff1a;批量管理&#xff0c;批量分发&#xff0c;批量执行&#xff0c;维护。。是python写的 批量管理工具&#xff1a; Ansible&#xff08;无客户端&#xff09;&#xff1a;无客户端&#xff0c;基于ssh进行管理与维护 Saltstack &#…

邮箱批量推送的效果如何?有哪些影响因素?

邮箱批量推送的工具怎么选&#xff1f;邮箱批量推送服务怎么样&#xff1f; 邮箱批量推送已成为企业推广产品和服务的重要手段。那么&#xff0c;邮箱批量推送的效果究竟如何&#xff1f;它是否能够有效提升企业的知名度和销售额&#xff1f;AokSend将分析邮箱批量推送的效果如…

嵌入式通信协议----Zigbee

一、简介 1.概念 Zigbee 是一种广泛用于连接物联网&#xff08;IoT&#xff09;设备的无线通信协议。它基于 IEEE 802.15.4 标准&#xff0c;使用低功耗数字无线电来创建个人区域网络&#xff08;PAN&#xff09;。Zigbee 网络的特点是数据速率低、功耗低、覆盖范围短&#xf…