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

news2024/12/29 13:09:23

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

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(刷新方式为)那么就全部会被写入到显示器文件里,并由显示器打印出来。

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

过程和向显示器文件写入内容一样,刷新方式采取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;                                                                                                                                
  }

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

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

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

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

相关文章

怎么用二维码在线下载视频?视频用二维码下载的制作方法

怎么把视频转换成二维码之后还可以下载视频呢&#xff1f;现在使用二维码的方式来分享视频内容在很多行业和场景中都有应用&#xff0c;这种方式能够更加简单快捷的完成视频的传播分享&#xff0c;那么怎么让扫码者可以自由选择下载视频呢&#xff1f;下面来给大家分享扫码下载…

[Vulnhub] Troll FTP匿名登录+定时任务权限提升

信息收集 IP AddressPorts Opening192.168.8.104TCP:21,22,80 $ nmap -sC -sV 192.168.8.104 -p- --min-rate 1000 Nmap scan report for 192.168.8.104 (192.168.8.104) Host is up (0.0042s latency). Not shown: 65532 closed tcp ports (conn-refused) PORT STATE SER…

2024年老王磁力搜索引擎实测好用,赶快收藏一下

对于不少老司机&#xff0c;多多少少都不知道磁力搜索&#xff0c;不管是学习&#xff0c;还行电影、电视剧、音乐。一个好的工具可以让我们节省大量的时间&#xff0c;只要你想要就可以找的到。 今天整理了几个磁力搜索磁力链接资源&#xff0c;除老王磁力还有整理了9个好用的…

使用LangChain+Ollama自己做的一个和大语言模型聊天的网站支持上下文对话,学习记录。

0.引言 在自己学习的过程中可以自己做一个和聊天大模型对话的一个小网站&#xff0c;成就感不亚于人生第一次跑完10km。 1.项目介绍 前端代码&#xff1a;Vue3, MarkDownIT. 后端代码&#xff1a;Python3, Fernet库, OpenAPI, LangChain, Ollama. Ollama 本地模型的部署和管理…

【经验分享】RT600 serial boot mode测试

【经验分享】RT600 serial boot mode测试 一&#xff0c; 文档描述二&#xff0c; Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一&#xff0c; 文档描述 RT600的启动模式共支持4种&#xff1a; 1&am…

Ubuntu系统下修改网卡IP地址

Ubuntu系统下修改网卡IP地址 一、Ubuntu系统介绍1.1 Ubuntu简介1.2 Ubuntu网络配置方式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、配置网卡IP地址4.1 备份网卡配置文件4.2 查看当前IP地址4.3 修改…

不在枯燥用第三方库简化你的编程之路

简介&#xff1a; Python作为一种多用途的编程语言,得益于其丰富的第三方库和框架,极大地拓展了其功能和应用领域.这些工具不仅提升了开发效率,也使得Python在各个领域展现出色的表现. 今天我们就来聊一聊Python 第三方库是由第三方开发者编写并共享的库,可用于扩展 Python 的…

【windows|006】基本分区和动态磁盘详解

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

buuctf----firmware

- -一定不能再ubutu22进行,我是在18(血泪教训) binwalk安装 buuctf firmware(binwalk和firmware-mod-kit的使用)_buu firmware-CSDN博客 参考博客 指令 sudo apt-get update sudo apt-get install python3-dev python3-setuptools python3-pip zlib1g-dev libmagic-dev pi…

Mars3d实现汽车尾气粒子效果从汽车屁股开始发射效果

本身的汽车尾气粒子效果&#xff1a;在汽车模型的中间发射的↓↓↓↓↓↓↓↓↓↓↓ Mars3d实例中是使用transY偏移值实现汽车尾气粒子效果从汽车屁股开始发射效果&#xff1a; // 动态运行车辆的尾气粒子效果 function addDemoGraphic4(graphicLayer) {const fixedRoute new…

【ARMv8/v9 GIC 系列 4.2 -- GIC CPU Interface 详细介绍】

文章目录 GIC CPU Interface 介绍CPU Interface 主要寄存器 GIC CPU Interface 介绍 A 系列处理器提供 5个管脚来实现中断&#xff0c;分别是&#xff1a; nIRQ&#xff1a;物理普通中断nFIQ&#xff1a;物理快速中断nVIRQ&#xff1a;虚拟普通中断nVFIQ&#xff1a;虚拟快速…

ArcGIS定义1.5度带坐标系与投影转换

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 对于ArcGIS如何定义高斯克吕格3度带、6度带&#xff0c;我相信大部分人都是比较清楚的&#xff0…

对红酒数据集,分别采用决策树算法和随机森林算法进行分类。

1.导入所需要的包 from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split 2.导入数据&#xff0c;并且对随机森林和决策数进…

内网安全[3]-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线

1.环境 隧道技术: 隧道技术是一类网络协议&#xff0c;它是一种数据包封装技术&#xff0c;它将原始IP包&#xff08;其报头包含原始发送者和最终目的地&#xff09;封装在另外一个数据包&#xff08;称为封装的IP包&#xff09;的数据净荷中进行传输&#xff0c;使用隧道的原…

PyTorch实战:模型训练中的特征图可视化技巧

1.特征图可视化&#xff0c;这种方法是最简单&#xff0c;输入一张照片&#xff0c;然后把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可。 2.特征图可视化代码如下&#xff1a; def featuremap_visual(feature, out_dirNone, # 特征图保存路径文件save_feat…

算法基础精选题单 动态规划(dp)(区间dp)(个人题解)

目录 前言&#xff1a; 正文&#xff1a; 题单&#xff1a;【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) NC50493 石子合并&#xff1a; NC50500 凸多边形的划分&#xff1a; NC235246 田忌赛马&#xff1a…

数据库浅识及MySQL的二进制安装

数据库基础概念与MySQL二进制安装与初始化 使用数据库的必要性 数据库可以结构化储存大量数据信息&#xff0c;方便用户进行有效的检索访问 有效的保持数据信息的一致性&#xff0c;完整性&#xff0c;降低数据冗余 可以满足应用的共享和安全方面的要求 数据库基本概念 数据…

[dataworks]从mysql导入数据、将结果导入到mysql、处理写错表名问题、创建依赖任务

一、从mysql导入数据 在ods的数据集成下点新建-->离线同步 1、起名imp_t_ods_uc_cst_terminal_dtl_df 前缀imp是import的缩写 t代表trade即MySQL的交易库(trade)的简写 ods即导入到ods层 uc_cst_terminal_dt为MySQL对应的表名 df为日全量导入&#xff08;di为日增量导…

真实还原汽车引擎声浪——WT2003Hx语音芯片方案

PART.01 产品市场 WT2003Hx是一款高性能的MP3音频解码芯片&#xff0c;具有成本效益、低功耗和高可靠性等特点&#xff0c;适用于多种场景&#xff0c;包括但不限于汽车娱乐系统、玩具、教育设备以及专业音响设备等。在模拟汽车引擎声的应用中&#xff0c;这一芯片的特性被特…

推荐一个十分好用的AI工具

推荐一个很好用的ai工具 链接在最下面 **介绍** ChatGPT 是由OpenAI开发的先进语言模型&#xff0c;旨在通过自然而流畅的对话方式与用户交互。无论是解决问题、提供建议&#xff0c;还是进行创意灵感的激发&#xff0c;ChatGPT都能为用户提供帮助。 **特点与优势** 1. **广泛…