【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.mzph.cn/web/7043.shtml

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

相关文章

Flask应用的部署和使用,以照片分割为例。

任务是本地上传一张照片,在服务器端处理后,下载到本地。 服务器端已经封装好了相关的程序通过以下语句调用 from amg_test import main from test import test main() test() 首先要在虚拟环境中安装flask pip install Flask 文件组织架构 your_pro…

基于Spring Boot的民宿管理平台设计与实现

基于Spring Boot的民宿管理平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 前台首页功能界面图,在系统首页可以查看首页…

【软件开发规范篇】JAVA后端开发编程规范

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

BeanUtils.copyProperties作用

文章目录 一、作用二、举例(1)新建两个实体类(2)pom引入依赖(3)main方法测试(4)结果输出(5)结论 一、作用 用来做对象间的copy。 二、举例 (1&…

Ubuntu部署前后端分离项目(前端vue,后端jar包)

一. Vue部署 1. 服务器安装node.js 2. 安装nginx 3. 上传vue包 将打包后的vue静态资源包dist文件夹,上传到服务器指定目录,并给该目录赋予相应权限。 4. 配置nginx (1) 创建vue项目配置文件 sudo vim /etc/nginx/conf.d/your-vue-project.conf (2)…

视频号小店在行业内的门槛高不高?有门槛是好事还是坏事?

大家好,我是电商小V 现在伴随着时代的慢慢发展,很多人都是想找一个好一点的创业项目,现在找创业项目都是找一些稍微有门槛的项目,没有门槛的话,要不然刚开始去做,项目就泛滥了,项目的红利期直接…

【AI】深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺……

深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺…… 来自:Axelera AI 资深软件工程师 Matthew Barrett 原帖是linkedin帖子: https://linkedin.com/posts/matthew-barrett-a49929177_i-think-its-fair-to-say-that-ml-compilation-ac…

GPT带我学-设计模式12-状态模式

啥是状态模式 状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变其行为。状态模式将对象的状态封装成不同的类,并使得对象在运行时可以动态地改变状态,从而改变对象的行为。状态模式的主要目的是促进代码的复用和灵活…

Terraform资源地址

在编码时有时会需要引用一些资源的输出属性或是一些模块的输出值,这都涉及到如何在代码中引用特定模块或是资源。另外在执行某些命令行操作时也需要显式指定一些目标资源,这时要掌握Terraform的资源路径规则。 一个资源地址是用以在一个庞大的基础设施中…

Python_4-远程连接Linux

文章目录 使用Python通过SSH自动化Linux主机管理代码执行ls结果:文件传输: 使用Python通过SSH自动化Linux主机管理 在系统管理与自动化运维中,SSH(Secure Shell)是一个常用的协议,用于安全地访问远程计算机…

FTP协议与工作原理

一、FTP协议 FTP(FileTransferProtocol)文件传输协议:用于Internet上的控制文件的双向传输,是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同…

富格林:累积经验阻挠黑幕之手

富格林认为,近年来现货黄金投资市场越发火热,许多投资新手纷纷涌入现货黄金市场中。不过,在这需要提醒大家的是要提防黑幕阻挠我们顺利盈利,选择正规可靠的平台进行开户,这样可以保证投资环境的安全稳定。下面富格林将…

水泥分类和使用方式 宁波水泥菱湖新阳水泥厂325鄞州东钱湖春晓咸祥海螺425水泥镇海骆驼庄市

水泥分类和使用方式 宁波水泥菱湖新阳水泥厂325鄞州东钱湖春晓咸祥海螺425水泥镇海骆驼庄市 水泥是一种重要的建筑材料,广泛应用于建筑、桥梁、隧道等各种土木工程项目中。根据不同的分类标准,水泥可以分为多种类型,每种类型的水泥都有其特定…

怎么给word文件名批量替换部分文字?word设置批量替换文字教程

批量替换Word文件名中的几个字,对于经常处理大量文件的人来说,是一项非常实用的技能。以下是一个详细的步骤指南,帮助你快速完成这项任务。 首先,你需要准备一个可以批量重命名文件的工具。市面上有很多这样的工具可供选择&#x…

win10禁止自动更新的终极方法

添加注册表值 1.运行,输入regedit 2.打开注册表编辑器依次进入以下路径“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”。 3.在Settings项中,新建DWORD(32位)值(D),重命名为以下命名“Fl…

easy_ssti_ctfshow_2023愚人杯

https://ctf.show/challenges#easy_ssti-3969 2023愚人杯有提示app.zip,访问 https://1f660587-5340-4b20-b929-c4549d9a5d4b.challenge.ctf.show/app.zip得到压缩包,拿到一个py文件 可以看到参数名是name,对参数进行筛选,包含ge…

人力资源管理新视野:挖掘员工潜力,共筑卓越未来

在21世纪的商业环境中,企业的成功不再仅仅依赖于资本、技术和市场策略,而更多地依赖于其人力资源的有效管理。人力资源管理的新视野正致力于挖掘员工的潜力,为企业创造持续的价值,共筑卓越的未来。 一、员工潜力的挖掘 员工是企业…

Linux如何查看JDK的安装路径

方法1 echo $JAVA_HOME 如果配置了系统就会输出配置为JAVA_HOME的jdk的的位置,如果没有配置就没有输出,推荐使用方法2 方法2(推荐) 关键命令分别为 1. which java 2. ls -lrt /usr/bin/java (路径依照自己的输出灵活去改&…

《Fundamentals of Power Electronics》——脉宽调制器建模

下图给出了一个简单脉宽调制器电路的原理图。 脉宽调制器电路产生一个用于指令转换器功率管导通和关断的逻辑信号δ(t)。该逻辑信号δ(t)是周期性的,其频率为fs,占空比为d(t)。脉宽调制器的输入是一个模拟控制信号vc(t)。脉宽调制器的作用是产生一个与模…

Qt QShortcut快捷键类详解

1.简介 QShortcut是一个方便的工具类,用于在应用程序中创建快捷键。通过设置快捷键和关联的处理函数,可以实现快速执行某个操作的功能。 // 创建一个快捷键,关联到MyWidget类的keyPressEvent()函数 QShortcut *shortcut new QShortcut(QKe…