【Linux系统编程十六】:(基础IO3)--用户级缓冲区

【Linux系统编程十六】:基础IO3--用户级缓冲区

  • 一.用户级缓冲区
  • 二.缓冲区刷新策略
    • 1.验证:
  • 三.缓冲区意义

一.用户级缓冲区

在这里插入图片描述
我们首先理解上面的代码,分别使用printf和fprintf,fwrite往1号文件描述符里输出,也就是往显示器上输出,然后输出完后,就将显示器文件关闭。

我们将发现最后什么都不会输出,这是为什么呢?
printf,fprintf,fwrite里不是封装了系统调用接口write吗?它不是将内容输出到显示器上了吗?为什么显示器上不显示呢?

因为我们输出的内容并没有到显示器上,而是放在了一个叫缓冲区的地方。
并且这个缓冲区绝不在内核里。为什么呢?如果这个缓冲区在内核里,那么只要当内容放进缓冲区里,最后程序结束肯定会刷新出来,而这里并没有刷新出来,说明这个缓存区不是内核里的缓冲区。那这个缓冲区是什么呢?

其实这个缓存区是在内核外面,是属于用户级别的缓冲区,它是C语言给我提供的缓冲区!

1.我们输出的内容首先会存放在C语言提供的缓冲区里,当有合适条件时,就会调用wirte接口将内容刷新写入到内核里。
在这里插入图片描述
2.而这个合适的条件就是指缓冲区的刷新策略,比如显示器文件当遇到\n时就会将当前和之前的内容全部刷新出去:刷新的本质就是调用wirte将内容写入到内核里:
在这里插入图片描述
3.所以这也验证了exit和_exit的区别:exit在退出之前会刷新缓冲区。而_exit在退出之前不会刷新缓冲区。不是_exit不想刷,而是_exit它是系统调用接口,在内核里面,而我们所说的缓冲区在内核外面,它怎么刷新呢?所以exit作为库函数封装了_exit,并且在调用_exit之前,肯定调用了fflush接口,刷新了缓冲区。
在这里插入图片描述

所以:目前在我们所学习中,只需要考虑用户级缓冲区,而不是内核里的缓冲区,内核里的缓冲区有操作系统来刷新。
在这里插入图片描述

二.缓冲区刷新策略

目前我们认为,只要将数据刷新到内核里面,数据就可以被硬件获取。中间的过程不要关心,由操作系统来解决。但是我们要理解缓冲区是如何刷新的,刷新策略有哪些:

缓冲区刷新问题:
1.无缓冲:直接刷新。
2.行缓冲:遇到\n就刷新,没有遇到就不刷新。—显示器文件刷新策略
3.全缓冲:缓冲区满了才刷新。—普通文件刷新策略
4.特殊:当进程退出时,也会刷新缓冲区。

在这里插入图片描述
【问题】缓冲区在哪里呢?
缓冲区在FILE结构体里:
FILE里除了封装了文件描述符,还有对应打开文件的缓冲区字段和维护信息:在这里插入图片描述

所以对应缓冲区,我们就可以看作是在用户层malloc申请的一块资源空间。

1.验证:

在这里插入图片描述
这里前三个调用库函数,最后一个调用系统调用write接口。最后再使用fork函数。
往显示器里输出:
显示器文件采取的刷新策略是行刷新,所以遇到换行,就会将缓冲区内容刷新。
过程也很简单:首先将要输入的内容放入缓冲区,如果有合适的条件就会调用write接口将数据写入到内核里:
在这里插入图片描述

fork创建的子进程,创建完后,后面也没有代码,就退出了。
而我们如果改成下面的操作就会发生不同的效果:
在这里插入图片描述
当我们将输出的内容重定向到log.txt文件时,再打印log.txt内容却发现打印了7条语句!这是为什么呢?

1.肯定和fork有关/肯定跟重定向有关
2.重定向后,就是往普通文件输出了,而不是往显示器文件里输出。所以缓冲区刷新策略就发生改变。
3.普通文件的刷新策略是全缓冲,也就是当缓冲区满了再刷新。
4.我们要理解缓冲区是用户级的,可以看成进程申请malloc的一块资源。
5.当我们从缓冲区内容刷新到操作系统里时,这个过程就相当于是写入数据了,而往父进程里写入数据,会发生写时拷贝,会将缓冲区拷贝一份给子进程。而当子进程创建出来后没有代码可用,就退出了,父进程也退出了。但要注意进程退出之前会将缓冲区的内容刷新,所以最后会将刷新两个一个的缓冲区内容到内核里。
6.witre是系统调用接口,直接就将数据写入到操作系统里,不会放入到缓冲区里。
在这里插入图片描述
在这里插入图片描述

根据以上的理解,我们就知道为什么第一个出现的是系统调用write输出的内容了,因为重定向后变成全缓冲,前面的三个库函数接口走完缓冲区里的内容还是不会刷新,要等缓冲区满了才会刷新,而系统调用直接就写入到内核里了。
并且也能理解为什么库函数的输出的内容输出了两次,因为重定向导致刷新策略改变和写时拷贝的发生。

三.缓冲区意义

缓冲区的存在可以解决用户效率的效率问题,可以赞上多个数据然后统一刷新,让我们的C语言接口变得更快。因为有些数据只是拷贝到缓冲区里,但并没有真正的写入操作系统,拷贝完后,后面的操作就跳过返回了。
还有一个作用那就是【配合格式化输出!没有缓冲区,C语言是无法完成格式化的输出的,需要有缓冲区来配合实现。

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

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

相关文章

5 Tensorflow图像识别(下)模型构建

上一篇:4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理,下面是完整的代码: import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…

3.4、Linux小程序:进度条

个人主页:Lei宝啊 愿所有美好如期而遇 目录 回车与换行的概念和区别 行缓冲区概念 进度条代码 version1 version2 version3 回车与换行的概念和区别 换行\n,回车\r 似乎无需多言 行缓冲区概念 这里我们通过例子来简单理解即可,深入…

基于单片机的智能扫地机设计

概要 本文主要设计一个简单的智能扫地机。该扫地机的核心控制元器件是stc89c52,具有编写程序简单,成本普遍较低,功能较多,效率特别高等优点,因此在市场上得到很大的应用。除此之外,该扫地机能够自动避开障碍…

C语言实现利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示

完整代码&#xff1a; /*利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间 的用B表示&#xff0c;60分以下的用C表示*/ #include<stdio.h>int main(){int score;char grade;printf("请输入你的成绩&#xff1a;&q…

IGP高级特性简要介绍(OSPF-上篇)

OSPF高级特性 一、OSPF_提升故障收敛及网络恢复速度 1.FRR与BFD快速恢复故障 1.1 FRR 在传统转发模式下&#xff0c;当到达同一个目的网络存在多条路由时&#xff0c;路由器总是选择最优路由使用&#xff0c;并且下发到FIB表指导数据转发。 当最优路由故障时&#xff0c;需…

Ubuntu18.04安装pcl-1.12.1,make时报错:/usr/bin/ld: cannot find -lvtkIOMPIImage

解决方案&#xff1a; 在vtk安装包中&#xff0c;重新打开cmake-gui&#xff0c;然后勾选上VTK_Group_MPI和VTK_Group_Imaging。 cd VTK-8.2.0 cd build cmake-gui然后重新编译生成。 make -j8 # 或者j4,量力而行。 sudo make install 就可以解决了。 然后重新回到pcl安装…

虚拟机没有桥接模式--物理机WiFi不见了--注册表修复

我们知道虚拟机有三种模式&#xff1a; vmnet0 桥接模式&#xff1b;vmnet1 仅主机模式&#xff1b;vmnet8 NAT模式 我自己以前一直用的NAT模式&#xff0c;今天突然要用到桥接模式&#xff0c;发现无法切换... 我下面这个是后面弄好了的&#xff0c;最开始是没有显示桥接模式…

Vue 3 中,watch 和 watchEffect 的区别

结论先行&#xff1a; watch 和 watchEffect 都是监听器&#xff0c;都是用来监听响应式数据的变化并执行相应操作。区别是&#xff1a; watch&#xff1a;需要指明要监听的数据&#xff0c;而且在回调函数中可以获取到属性变化的前后值&#xff1b; 适用于需要精确控制监视…

quickapp_快应用_快应用组件

快应用组件 web组件web页面与快应用页面通信网页接收/发送消息网页接收消息 快应用页面接收/发送消息给网页发送消息 通信前提- trustedurl web组件 作用&#xff1a;用于显示在线的 html 页面(可以嵌入三方页面或者某些不太重要的页面) 缺点&#xff1a;打开会比原生慢一点&…

容联七陌携手岚时科技,解决医美机构回访3大痛点

近日&#xff0c;岚时科技研发中心联合容联七陌发布了全新的智能呼叫中心系统&#xff0c;5大功能模块解决了医美机构回访过程中的3大难题&#xff1a;客户资产保全困难、客户回访技术被卡脖子、回访人员&#xff08;客服、咨询&#xff09;效率管理困难。 “智能呼叫中心”通过…

Camtasia2024破解版电脑屏幕录制剪辑软件

屏幕录制剪辑 TechSmith Camtasia for Mac v2021是 TechSmith 公司所开发出一款专业屏幕录像和编辑&#xff0c; Camtasia Studio2024版是由TechSmith公司官方进行汉化推出的最新版本,除2023版以下版本均没有官方汉化。 同时TechSmith公司打击第三方贩卖Camtasia Studio汉化的…

MS2111多点低压差分(M-LVDS)线路驱动器和接收器

MS2111 是多点低压差分 (M-LVDS) 线路驱动器和接收器。经过 优化&#xff0c;可运行在高达 200Mbps 的信号速率下。所有部件均符合 M LVDS 标准 TIA / EIA-899 。该驱动器的输出支持负载低至 30Ω 的多 点总线。 MS2111 的接收器属于 Type-2 &#xff0c; 可在 -1…

第三章:人工智能深度学习教程-基础神经网络(第五节-了解多层前馈网络)

让我们了解反向传播网络 (BPN) 中的误差是如何计算的以及权重是如何更新的。 考虑下图中的以下网络。 反向传播网络(BPN) 上图中的网络是一个简单的多层前馈网络或反向传播网络。它包含三层,输入层有两个神经元 x 1和 x 2,隐藏层有两个神经元 z 1和 z 2,输出层有一个神经…

基于element-ui封装可配置表单组件

“vue”: “^2.7.13” “element-ui”: “^2.15.7” 代码地址 【说明】 该组件时使用vue3&#xff08;vue2.7&#xff09;语法封装&#xff0c;使用时可用vue2语法使用也可以使用vue3语法使用 一、vue2语法使用案例 基础用法 <template><div class"form-demo…

擎创动态 | 开箱即用!擎创科技联合中科可控推出大模型一体机

一、金融行业大模型一体机发布 10月26日至27日&#xff0c;2023金融科技安全与创新大会顺利召开。会上&#xff0c;中科可控联合擎创科技、卓世科技、文因互联、百川智能、捷通华声、智谱华章、易道博识等9大厂商&#xff0c;发布了9款金融行业大模型一体机&#xff0c;为金融…

加速度jsudo:小企业会遇到哪些瓶颈期?

什么是瓶颈期&#xff1f;瓶颈期&#xff0c;就是你无论怎么努力&#xff0c;成绩都是上不去&#xff0c;还是停留在原地&#xff1b;而自己表现的还是很匆忙&#xff0c;却不知道如何下手&#xff1f;就像水桶效益一样&#xff0c;水桶的木板高度层次不齐&#xff0c;像极了自…

安防监控系统EasyCVR平台设备通道绑定AI算法的功能设计与开发实现

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

Mysql数据库的备份和恢复及日志管理

一、数据备份概述 1.1 备份的分类 完全备份&#xff1a;整个数据库完整地进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 冷备份&#xff1a;关机备份&#xff0c;停止mysql服务&#xff0c;然后进行备份 热备份&#xff1a;开机备…

从零开始的C++(十四)

继承&#xff1a; 作用&#xff1a;减少重复代码&#xff0c;简化程序。 用法&#xff1a; class b&#xff1a;public a {//...b中成员 } 在如上代码中&#xff0c;b类以public的方式继承了a类。规定a类是父类、基类&#xff0c;b类是子类、派生类。 关于继承方式&#xf…

[动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍

[动态规划] (十一) 简单多状态: LeetCode 面试题17.16.按摩师 和 198.打家劫舍 文章目录 [动态规划] (十一) 简单多状态: LeetCode 面试题17.16.按摩师 和 198.打家劫舍题目分析题目解析状态表示状态转移方程初始化和填表顺序 代码实现按摩师打家劫舍 总结 注&#xff1a;本题与…