Linux-- 重定向缓冲区

news2024/11/28 0:33:37

目录

0.接上篇文章

1.粗略的见一下这两个问题

2.理解重定向 

3.理解缓冲区 


0.接上篇文章

Linux--基础IO(文件描述符fd)-CSDN博客

1.粗略的见一下这两个问题

先来了解几个函数:

         stat()函数用于获取指定文件或符号链接的元数据。如果文件是一个符号链接,stat()将返回该符号链接本身的元数据,而不是它所指向的目标文件的元数据。

   fstat()函数用于获取已打开文件的元数据。它通常用于在文件描述符已经打开之后获取文件的元数据。

   lstat()函数与stat()函数类似,但它专门用于获取符号链接的元数据。如果指定的文件是一个符号链接,lstat()将返回该符号链接本身的元数据,而不是它所指向的目标文件的元数据。

  • fd:一个已打开的文件描述符。
  • buf:一个指向struct stat的指针,用于存储符号链接的元数据。
  • path:要检查的文件或目录的路径。

        这三个函数都使用struct stat结构来存储文件的元数据。这个结构包含了许多字段,如文件类型(普通文件、目录、符号链接等)、权限、所有者ID、组ID、大小、时间戳等。具体的字段取决于你的系统和编译器,但你可以查阅sys/stat.h头文件以获取更多详细信息。

演示:


再来看一段代码:

        我们打开文件的时候做了一个操作,colse(1)首先关闭了文件描述符 1,我们知道文件描述符1,表示的是显示器文件,而printf&&fprintf都是向显示器上打印的,现在关闭了显示器文件,意味着显示器上不会出现打印的内容。

        文件描述符1被关闭了,意味着fd1空了出来,那么log.txt将继承fd1(文件描述符分配规则;查自己的文件描述表,分配最小的没有被使用的fd),那么现在向fd1中写就是在向log.txt中写,所以我们查看到log.txt中的内容就是printf&&fprintf输出的内容,这就是对文件做重定向重定向的本质:是在内核中改变文件描述符表特定下标的内容,和上层无关!)

在这段代码中:我们还需要注意一点,fflush(stdout)刷新stdout,如果不进行此操作,log.txt中是不会有任何内容的,这是为什么呢?

原因是:在struct FILE*这个结构体中存在语言级别的缓冲区,我们在使用printf&&fprintf时,并不是直接通过文件描述符写入到内核文件缓冲区中,而是先写到语言级别的缓存区中,再由C语言通过文件描述符,刷新到内核文件缓存区当中,此时外设才能看到输出的内容,因此fflush(stdout)此时的工作是将stdout缓冲区中的内容通过文件描述符1,刷新到log.txt内核文件缓存区当中去,这时候log.txt中才能看到内容。如果没有close(fd)这一语句,那么不加刷新也没关系,进程结束之后,会自动通过fd刷新到文件中。


2.理解重定向 

先认识一个系统调用接口:dup2

  dup2 的功能是将一个已存在的文件描述符复制到另一个文件描述符,如果目标文件描述符已经打开,则先将其关闭。(本质是文件描述符下标所对应内容的拷贝)

#include <unistd.h>  
  
int dup2(int oldfd, int newfd);

1. 标准输出重定向,由显示器打印->log.txt打印(接上面例子,我们使用dup2系统调用接口该如何做呢?)

        也就是我们没有关闭fd1,那么新打开的log.txt的fd就是3,我们使用了dup2的效果就是,把fd3的内容拷贝给了fd1,也就是说,让fd1指向了文件log.txt,所以未来向fd1里写入内容,实际上就是向log.txt中写入内容,最终只会留下fd3(oldfd)。(fd1和fd3里的地址一样l)

那么代码就应该这么写:

这样输出到显示器的内容就输出到log.txt了


3.理解缓冲区 

在Linux操作系统中,缓冲区是一个非常重要的概念,主要用于提高I/O(输入/输出)操作的效率。以下是关于Linux操作系统中缓冲区的理解:

  1. 概念:缓冲区是内存中的一块区域,用于临时存放数据。当进程需要向外部设备(如磁盘、网络等)写入数据时,它不会直接将数据写入设备,而是先将数据写入到缓冲区中。同样,当进程从外部设备读取数据时,数据也是先从设备读取到缓冲区,当缓冲区的数据到达某个值的时候,在统一的刷新到进程中。
  2. 作用
    • 减少对外部设备的直接访问次数,从而降低I/O操作的开销。
    • 允许进程进行批量数据传输,从而提高数据传输的效率。
    • 通过缓存数据,可以实现对数据的预处理和后处理,如数据压缩、加密等。
  3. 刷新策略:Linux中的缓冲区有不同的刷新策略,以适应不同的应用场景。
    • 无缓冲:数据一写入到缓冲区就立即刷新到外部设备。(eg:1.语言级的缓冲区printf/fprintf,2.系统调用fsync)
    • 行缓冲:当在输入或输出中遇到换行符(\n)时,缓冲区会刷新一次。这种策略常用于与终端设备(如显示器)的交互。
    • 全缓冲:当缓冲区满时,数据才会被刷新到外部设备。这种策略常用于写入磁盘文件等场景。
    • 特殊情况(1.进程退出,自动刷新;2强制刷新)
  4. 与文件系统的关系:在Linux文件系统中,缓冲区也起着重要的作用。当应用程序读取文件时,内核会将文件数据读入内核空间缓冲区中,然后再将数据从内核空间缓冲区复制到用户空间缓冲区中。同样地,当应用程序向文件写入数据时,数据也是先写入到用户空间缓冲区中,然后再由内核将数据从用户空间缓冲区复制到内核空间缓冲区,并最终写入到磁盘上。
  5. 缓冲区就在struct FILE*结构体中,每一个文件都有自己的缓冲区(这是在语言层面的)

补充示例

        刷新策略发生改变,看下面的两段代码:

第一段代码及它的运行结果(我们将打印到屏幕的内容重定向到文件中)

第二段代码及它的运行结果(与第一段代码不同的是,加入了一个fork函数)

问题:为什么加了fork之后,会打印两次内容,fork不是只会继承父进程下面的代码吗?为什么C语言库函数的内容打印了两次,而系统调用的只打印了一次呢?

        首先./mytest这个操作是向显示器文件打印,显示器文件的刷新策略是行缓冲,现在转为向普通文件打印,普通文件的刷新策略是全缓冲,由显示器文件转向普通文件打印,这里刷新策略就发生了改变此时printf/fprintf在执行完之后,缓冲区还没有写满(因为是全缓冲),不做刷新,最后fork的时候就出现了父子进程,fork结束后进程就直接退出了,此时父子进程都要执行刷新,所以就打印了两次内容,而系统调用接口是直接向内核级缓冲区中写的,所以不存在刷新两次的问题了。

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

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

相关文章

大数据BI可视化(Echarts组件)项目开发-熟悉结合Vue开发图表组件7.0附带1/6商家销售统计(横向柱状图)

一.创建项目 创建 1.npm install -g vue/cli vue create vision 2. 3. 4.版本 5.是否使用历史路由 6.CSS预处理 7.ES标准配置 8.啥时候es标准提示-保存文件后 9.将配置文件放入单独文件中处理 10.需要保留新建项目以上设置 11.选择“Use PNPM”或者“Use NPM” 12.创建 13访…

时间瑾眼中的IT行业现状与未来趋势

文章目录 技术革新与行业应用IT行业的人才培养与教育人工智能与机器学习的演进数据安全与隐私保护可持续发展与绿色技术社会责任与道德规范 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链…

AI 入门:AI 提示词如何入门?这篇就够了!(含提示词)

先看案例&#xff0c;一目了然 一个通用的提示词案例&#xff1a; 普通的提示词&#xff1a; 我给你我写的参考文章&#xff0c;请你学习我的风格来根据主题创作1篇文章。请你根据我给你的参考文章&#xff0c;学习我的写作风格&#xff0c;并进行风格学习模仿创作。为了更好…

python智能电力监控与资费电费缴纳管理系统vue+django

本系统的设计与实现共包含6个表:分别是配置文件信息表&#xff0c;电力记录信息表&#xff0c;故障报修信息表&#xff0c;缴费订单信息表&#xff0c;用户表信息表&#xff0c;用户信息表&#xff0c; 本文所设计的电费缴纳系统的设计与实现拥有前端和后端&#xff0c;前端使…

【声呐仿真】学习记录3.5-docker中Gazebo是否使用GPU?解决声呐图像黑屏

【声呐仿真】学习记录3.5-docker中Gazebo是否使用GPU&#xff1f;解决声呐图像黑屏 &#x1f921;打包镜像&#xff0c;重装驱动&#xff08;失败&#xff09;Xorg重新配置DAVE环境&#xff08;补充之前教程中的一些细节&#xff09;解决声呐图像黑屏问题 在容器中运行 roslau…

在ubuntu中使用python

在ubuntu中使用python ubuntu20版本中已经涵盖了python3&#xff0c;需要使用python3命令去运行 可以使用命令 python3 --version 进行检查 ubuntu20版本中已经涵盖了python3&#xff0c;需要使用python3命令去运行 可以使用命令 python3 --version 进行

基于STM32F401RET6智能锁项目(AT24C0X存储芯片)

一、IIC基本介绍 1、IIC通信接口 • I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 • 两根通信线&#xff1a;SCL&#xff08;串行时钟线&#xff09;、SDA&#xff08;串行数据线&#xff09; • 同步&#xff0c;半双工 • 带数据应答 •…

长途火车~48小时记录

1.出门记得带大功率充电宝&#xff0c;最好是50000ma及以上的&#xff0c;不然还没上火车&#xff0c;手机就没电了&#xff0c;电量焦虑症又来了。手机有电就有无限可能。

家政服务新体验——家政小程序开发,让生活更轻松!

一、引言 随着现代生活节奏的加快&#xff0c;家政服务已经成为越来越多家庭不可或缺的一部分。然而&#xff0c;传统家政服务方式往往存在预约不便、服务质量参差不齐等问题。为了解决这些问题&#xff0c;我们精心打造了一款家政小程序&#xff0c;为您带来全新的家政服务体…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 &#xff1a;程序员;相关院校师生 本书以轻松幽默的语言&#xff0c;从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序&#xff0c;寓意带读者从入门到精通。 书中每章都设有总结与扩展…

绝地求生PUBG初版艾伦格回归 初版艾伦格和新版有什么区别

PUBG终于迎来了经典的旧版艾伦格地图的回归&#xff01;我们希望通过本次经典艾伦格的回归为大家带回记忆中那一幕幕熟悉的场景&#xff0c;并让大家好好回味一番当年与好友们共同冒险的峥嵘岁月&#xff01;还怀念从前为了抢到自己最爱的武器而飞奔的日日夜夜吗&#xff1f;那…

从编辑器角度来理解定义和声明

报错,在函数里面(包括int main函数)extern声明会和定义冲突 下面这种写法就很ok 静态变量的反汇编 #include<iostream> using namespace std; extern int c; int ma

如何在 CloudFlare 里屏蔽/拦截某个 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置订单基本很少折腾自己的 CloudFlare 配置了,今天给大家简单的讲解一下如何在 CloudFlare 里屏蔽/拦截 IP 地址和 IP 地址段,虽然明月一直都很反感针对 IP 的屏蔽拦截,但不得不说有时候还是很有必要的。并且,既然可以拦截屏蔽 IP 自然也可以但…

【机器学习】人力资源管理的新篇章:AI驱动的高效与智能化

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

共享云桌面到底有哪些优势?

共享云桌面作为一种新兴的云桌面技术&#xff0c;近年来在企业设计和办公环境中得到了广泛的应用。它通过将物理服务器的计算资源共享化&#xff0c;实现多个用户共享同一台服务器的桌面环境&#xff0c;从而带来了诸多明显的优势。 企业在用传统办公电脑和虚拟云桌面的过程中…

一键批量剪辑,轻松上手:视频剪辑随机分割技巧全解析

在数字化时代&#xff0c;视频剪辑已经成为许多人日常生活和工作中的必备技能。无论是为了制作一部精美的短视频&#xff0c;还是为了将长视频分割成多个片段&#xff0c;掌握视频剪辑技巧都显得尤为重要。本文将为您详细解析云炫AI智剪一键批量剪辑随机分割技巧&#xff0c;帮…

数据中心--AI时代的“炼油厂”

数据中心正在成为AI时代的“炼油厂”&#xff01; 众所周知&#xff0c;AI的高歌猛进催生了对数据的海量处理需求。为了满足蓬勃的算力需求&#xff0c;全球开启了新一轮的数据中心建设热潮&#xff0c;数据中心业务正在以指数级的速度疯狂扩张。 此番情景&#xff0c;和第二…

VMamba模型

VMamba模型 摘要Abstract1. VMamba模型1.1 文献摘要1.2 研究背景1.3 状态空间模型&#xff08;SSM&#xff09;1.4 VMamba架构1.5 实验1.5.1 ImageNet-1K 上的图像分类1.5.2 COCO 上的物体检测 总结2. pytorch练习 摘要 本周阅读了 VMamba: Visual State Space ModelVMamba 这…

Linux内核下RAS(Reliability, Availability and Serviceability)功能分析记录

1 简介 Reliability, Availability and Serviceability (RAS) — The Linux Kernel documentation 在服务器 和 卫星等领域&#xff0c;对设备的稳定性要求很高&#xff0c;需要及时的发现并处理软/硬件上的错误。RAS功能可以用来及时的发现硬件上的错误。 RAS功能需要硬件的…

网页版五子棋的自动化测试

目录 前言 一、主要技术 二、测试环境的准备部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 登录页面 注册页面 游戏大厅页面 游戏房间页面 测试套件结果 4.3、界面测试 登录页面 注册页面 游戏大…