Linux重定向及缓冲区理解

重定向:

        在上一期虚拟文件系统中讲到了每个进程在打开后,都会默认打开3个文件,如下:

stdin     标准输入(键盘)    文件描述符:0

stdout   标准输出(显示器)文件描述符:1

stderr   标准错误                   文件描述符:2

接下来仔细观察下面代码:

 解释:先关闭默认打开的标准输出文件,再打开一个文件命名为log.txt,用c语言的接口printf和fprintf分别向显示器输出数据,刷新一下缓冲区(后面讲),最后关闭fd。

程序运行后,显示器上什么也没打印。

可以发现,原本要打印在显示器上的内容竟然神奇地打印到了文件里!!!为什么???

解释原因:

当一开始关闭标准输出后,文件描述符1就被空了出来,再打开新的文件,新文件被分配的文件描述符就是1,c语言的printf内部实际是往stdout中打印,fprintf也指定了是往stdout中打印,但在c语言中stdout的文件描述符只认1,c语言只认为stdout的文件描述符是1,所以它只往文件描述符为1的文件中打印,所以打印到了文件中!

上述的现象就是一种重定向,所以:

 重定向的本质:是在内核中改变文件描述表特定下标的内容,和上层无关!

 dup2接口:

        接下来介绍一个重定向的重要接口dup2,先查一下手册:

简单来说它的功能就是: 将文件描述符表下标为oldfd的内容拷贝到文件描述符下标为newfd的内存中,我们用dup2来实现一下之前的重定向操作。

运行结果:

因为之前没关1文件,所以它被分配的文件描述符是3,但我们用dup2改变了文件描述符下标为1的内容,将它的内容改为和下标为3的内容一样,做到了重定向;

 

缓冲区:

        在上一篇文件系统中我讲到,linux每个文件都有自己的文件内核级缓冲区,也就是一段内存空间,但它究竟有什么用?

其实在语言层面,对每个文件也有个语言级缓冲区,也称用户级缓冲区。它的主要作用就是,解耦和提高效率

 主要还是提高效率,我举一个简单的例子来帮助理解,我们就是用户,而物流公司其实就是一个巨大的缓冲区,我们要送东西到目的地不用自己跑,提高了用户的效率,但物流公司不会只因为你的一间货物就开始送货,它会等到货满了或者没有新的货物了,才开始送货了,这里提高了刷新IO的效率。

我们在打印数据到显示器时,大概率不会只打印一行,会打印很多数据,我们不可能每次读到一行要打印的数据就调用系统调用接口去打印到文件中,因为调用系统调用是有成本的,每次遇到需要打印的数据就让它进入语言级缓冲区,根据刷新策略来决定什么时候调用系统调用来刷新到内核级缓冲区,再由内核级缓冲区刷新到文件中。

来简单介绍一下几种刷新策略:

1.立刻刷新。

2.行刷新。一般用于显示器,因为要适应用户的阅读习惯。

3.全缓冲。满了才刷新,普通文件

 还有特殊情况,当进程退出或者使用fflush接口也可以立刻刷新缓冲区。

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

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

相关文章

C++组合类

类的数据成员不但可以是基本类型,也可以是其它类的对象。 组合类就是指一个类包含其他类的对象作为该类的数据成员。 当组合类创建对象时,其中包含的各个数据成员对象应首先被创建。因此,在创建类的对象时,既要对本类的基本…

贪吃蛇(c实现)

目录 游戏说明: 第一个是又是封面,第二个为提示信息,第三个是游戏运行界面 游戏效果展示: 游戏代码展示: snack.c test.c snack.h 控制台程序的准备: 控制台程序名字修改: 参考&#xff1a…

DELL T630服务器iDRAC分辨率调整办法

对于Dell T630服务器的iDRAC分辨率调整,您需要登录到iDRAC的Web界面。以下是详细的步骤: 登录iDRAC:在浏览器中输入iDRAC的IP地址,然后使用用户名(通常是“root”)和密码登录。 导航到虚拟控制台&#xff…

(Java)心得:LeetCode——19.删除链表的倒数第 N 个节点

一、原题 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…

IEEE 802.11标准

在IEEE 802.11标准中使用了扩频通信技术,主要作用是使得抗干扰性更强。 IEEE 802.11在MAC层采用了CSMA/CA协议。 IEEE 802.1x是一种基于端口认证协议。

报表-接口类型的数据源

1、配置 在数据中进行如下配置 配置格式,换行的方式 #API $.data[0].children http://192.168.1.1:9200/apis/getInfo 行1:固定写法,标识这是一个接口类型的数据集 行2:JSONPath格式字符串,对接口的数据进行取值。…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-关系模式

👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️进入狂砍分⭐ ⭐软件设计师高频考点文档, ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ 🎶(A) 考点1,关系模式 考点: 三个模式相…

kettle经验篇:MongoDB-delete插件问题

目录 项目场景 问题分析 解决方案 MongoDB Delete插件使用总结 项目场景 项目使用的ODS层数据库是MongoDB;在数据中心从DB层向ODS层同步数据过程中,发现有张ODS表在同步过程中,数据突然发生锐减,甚至于该ODS表数据清0。 同步…

Zabbix6.0容器化部署(Docker-Composed)

Zabbix 为每个 Zabbix 组件提供 Docker image 作为可移植和自给自足的容器,以加快部署和更新过程。 Zabbix 组件在 Ubuntu、Alpine Linux 和 CentOS 基础 image 上提供:Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Apache2 和 Nginx Web 服务器。 1. Zabbix 组件…

17 SPI FLASH读写

SPI 协议简介 SPI 即 Serial Periphera linterface 的缩写,顾名思义就是串行外围设备接口,主要用于与FLASH、实时时钟、AD 转换器等外设模块的通信,它是一种高速的全双工同步的通信总线。 SPI 设备分为主设备和从设备,SPI 通信必…

Pikachu 靶场 RCE 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台,用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境,供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术,…

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…

sumif的求和区域是文本格式怎么办?

sumif函数的求和区域是文本型数字&#xff0c;不更改源数据的情况下怎么求和呢&#xff1f; 一、不能使用SUMIF、SUMIFS函数 这两个函数的求和区域只能是引用&#xff0c;不能是公式运算的内存数组&#xff0c;因此不能用公式或运算符将求和区转换成数值。当引用来的数据是文本…

【C/C++】C/C++ 校园失物招领系统设计与实现(源码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

一套MySQL读写分离分库分表的架构,被秀到了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

算法设计与分析 例题 绘制Huffman树、循环赛、分治、最短路与动态规划

1.考虑用哈夫曼算法来找字符a,b,c,d,e,f 的最优编码。这些字符出现在文件中 的频数之比为 20:10:6:4:44:16。要求&#xff1a; &#xff08;1&#xff09;&#xff08;4 分&#xff09;简述使用哈夫曼算法构造最优编码的基本步骤&#xff1b; &#xff08;2&#xff09;&…

Java数据结构---栈和队列

目录 栈&#xff08;Stack&#xff09; 队列&#xff08;Queue&#xff09; 循环队列 栈&#xff08;Stack&#xff09; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除操作元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一…

2024最新商业视频打赏系统源码 多套模板 有代理后台 已对接支付

简介&#xff1a; 2024最新商业视频打赏系统源码 多套模板 有代理后台 已对接支付 图片&#xff1a; 源码下载

IC-Light-在stable diffusion中实现图像的光影控制新方法 - 技术原理篇

&#x1f468;背景与来源 最近在stable diffusion的粉丝群看到光影控制又有了新的玩法&#xff0c;是controlnet的作者lllyasviel&#xff0c;发了一款名为IC-Light的模型&#xff0c;并且已经被另外一位名为huchenlei的朋友实现了comfyui和webUI&#xff08;forge &#xff0…

事件高级部分

一&#xff0c;注册事件 即给元素添加事件 1.传统注册方式 2.方法监听注册方式 事件类型&#xff1a;字符串形式&#xff0c;不用带on 可以给一个元素添加多个程序 二.删除事件 1.方式 参数见上文 三.DOM事件流 事件的传播过程叫做事件流 js代码只能获取一个阶段&#xf…