【Linux IO基础】缓冲区

概念

缓冲区的主要作用是提高效率 --- 提高使用者的效率,因为有缓冲区的存在,我们可以积累一部分再统一发送,提高发送的效率。

刷新方式

缓冲区因为能够暂存数据,必定要有一定的刷新方式:

一般策略:

  • 无缓冲(立即刷新)

  • 行缓冲(行刷新)

  • 全缓冲(缓冲区满了,再刷新)

特殊情况:

假如快递站是缓冲区,那么如果一直等到缓冲区满了,客人往往会不耐烦,因此也有别的刷新方式:

  • 强制刷新

  • 进程退出的时候,一般要进行刷新缓冲区

    一般对于显示器文件:行刷新(行缓冲)

    对于磁盘上的文件:全缓冲(缓冲写满,再刷新)

示例

可以看到myfile里只有四条打印的代码,但是重定向log里却有七条信息,这是为什么?

  1. 当我们直接向显示器打印的时候,显示器文件的刷新方式是行刷新!而且你的代码 输出所有的字符串,都有\n,fork之前,数据全部已经被刷新,包括syystemcall

  2. 重定向到log.txt,本质是向磁盘文件中写入(不是显示了哦!),我们系统对于数据的刷新方式已经由行刷新,编程了全缓冲!

  3. 全缓冲比意味着缓冲区变大,实际写入的简单数据,不足以把缓冲区写满,fork执行的时候,数据依旧在缓冲区中!

  4. 我们所谈的"缓冲区",和操作系统是没有关系的,只能和C语言本身有关!(因为fprintf/printf/fputs底层都是封装的write)

  5. C/C++提供的缓冲区,里面一定保存的是用户的数据,属不属于当前进程在运行时自己的数据呢?属于! 如果我们把数据交给了操作系统,这个数据就属于操作系统,不属于我自己的。

  6. 当进程退出的时候,一般要进行刷新缓冲区,即便你的数据没有满足刷新条件! ''刷新缓冲区''属于清空或者"写入"操作。

  7. fork立马退出,任意一个进程在退出的时候刷新缓冲区,就要发生写时拷贝!!!而write系统调用,没有使用C的缓冲区,它是直接把数据写入到操作系统,数据也就不属于进程,不发生写时拷贝了!

至于为什么fprintf/printf/fputs命令会因为fork的调用而被再次执行,因为当程序调用fork函数时,操作系统会复制当前进程的内存空间,包括文件描述符和缓冲区。在这种情况下,父进程和子进程共享相同的标准输出缓冲区。因此,当父进程在执行上面三个命令时,这些输出会先被放入共享的缓冲区中,而非write一样被直接输出,当执行fork函数,操作系统会创建一个新的子进程,子进程也会继承父进程的缓冲区内容。

总之,在fork函数执行前,C文件中的四条命令都会将数据写入到log中,而fork执行后,子进程和父进程共享缓冲区,当子进程执行完毕退出时,因为满足特殊情况,所以操作系统会将缓冲区的内容(也就是除了write的三条命令输出的数据)刷新并输出到log文件中,所以在将myfile重定向到log之后,log文件中有7条数据而不是4条。

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

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

相关文章

【C 数据结构-动态内存管理】3. 伙伴系统管理动态内存

文章目录 【 1. 伙伴系统的结构设计 】【 2. 分配算法 】【 3. 回收算法 】 伙伴系统 本身是一种动态管理内存的方法,和边界标识法的区别是:使用伙伴系统管理的存储空间,无论是空闲块还是占用块,大小都是 2 的 n 次幂(…

【承装修、试电力施工许可证申报指南】广西承装(修、试)电力设施许可证资质代办流程

【承装修、试电力施工许可证申报指南】广西承装(修、试)电力设施许可证资质代办流程 广西承装(修、试)电力设施许可证资质代办流程 在广西地区,承装、修、试电力设施许可证的资质代办流程相对复杂,但遵循一定的步骤和规定,可以确保流程的顺利…

MobileNet网络详解

一、了解 网络亮点: 1、DW网络,大大减少运算量核参数数量 2、增加超参数:控制卷积层卷积核个数的超参数 ,控制图像输入大小的超参数 ,这两个超参数是人为设定的,不是机器学习到的。 二、DW卷积&#xff…

Windows环境编译 VVenC 源码生成 Visual Studio 工程

VVenC介绍 Fraunhofer通用视频编码器(VVenC)的开发是为了提供一种公开可用的、快速和有效的VVC编码器实现。VVenC软件基于VTM,其优化包括软件重新设计以减轻性能瓶颈、广泛的SIMD优化、改进的编码器搜索算法和基本的多线程支持以利用并行。此外,VVenC支…

端口被其他进程占用:OSError: [Errno 98] Address already in use

一、问题描述 错误提示端口号正在被使用 二、解决办法 1.使用 lsof 命令,列出所有正在监听(即被绑定)的网络连接,包括它们所使用的端口号 sudo lsof -i -P -n | grep LISTEN 2.解绑被绑定的端口号 根据 netstat 或 lsof 命令…

【C++】对文章分词,并对词频用不同排序方法排序,比较各排序算法效率

文章分词 1.问题描述2.需求分析3.概要设计3.1 主程序流程3.2 函数调用关系 4.主函数实现4.1 main.h4.2 main.cpp 5. 函数实现5.1 processDic函数5.2 forwardMax函数5.3 countWordFreq函数5.4 quickResult函数5.5 bubbleResult函数…

大模型系列之解读MoE

Mixtral 8x7B 的推出, 使我们开始更多地关注 基于MoE 的大模型架构, 那么,什么是MoE呢? 1. MoE溯源 MoE的概念起源于 1991 年的论文 Adaptive Mixture of Local Experts(https://www.cs.toronto.edu/~hinton/absps/jjn…

【GDPU】数据结构实验十 哈夫曼编码

【实验内容】 1、假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成,它们在电文中出现的概率分别为{ 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10 },试为这8个字母设计哈夫曼编码。 提示:包含两个过程:(1)构建…

C语言实现面向对象—以LED驱动为例

点亮一个LED 常见的LED代码 分层分离思想 面向对象的LED驱动 LED左边高电平。 当LED右边为低电平时,LED有电流通过,LED亮。反之,LED灭 GPIO功能描述: 点亮LED的步骤及代码: 开启GPIO的时钟 配置GPIO为输出模式 …

04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)

04-22 周日 阿里云-瑶光上部署FastBuild过程 时间版本修改人描述2024年4月22日14:18:59V0.1宋全恒新建文档2024年4月23日20:41:26V1.0宋全恒完成了基本流程的添加 简介 前提 准备两台服务,一台部署Docker,一台部署FastBuild的镜像容器服务所述的Docke…

stm32f103zet6_DAC_2_输出电压

实现效果 DAC输出的电压 同过电压表测量电压 1.DAC配置的步骤 初始化DAC时钟。配置DAC的GPIO端口。设置DAC的工作模式(例如,是否使用触发功能,是否启用DAC中断等)。启动DAC。 2常用的函数 函数 HAL_DAC_Start() - 开启指定…

软件系统概要设计说明书(实际项目案例整理模板套用)

系统概要设计说明书 1.整体架构 2.功能架构 3.技术架构 4.运行环境设计 5.设计目标 6.接口设计 7.性能设计 8.运行设计 9.出错设计 全文档获取进主页 软件资料清单列表部分文档(全套可获取): 工作安排任务书,可行性分析报告&…