【文件fd】深入理解重定向和缓冲区

news2024/9/22 19:35:59

目录

1.重定向

1.1dup2 

2.缓冲区

2.1什么是缓冲区

2.2为什么存在缓冲区

2.3缓冲区的刷新策略

2.4查看源码​

3.0/1/2

3.1 0/1/2是什么&为什么存在

3.2 2和1区别

3.3 2为什么存在


1.重定向

  • 重定向的本质:是在内核中改变文件描述符表特定下标的内容和上层无关❗、
  • 上层不变,OS只给上层一个数字。下标也不变,主要是变文件描述符表(指针数组)元素内容。
  • 重定向是OS系统级别的修改,struct files_struct是内核数据结构。要修改文件描述符表中元素(指针/指向)必须要OS给用户提供系统调用。

1.1dup2 

  • man 2 dup2
  • int dup2(int oldfd, int newfd);
  • dup2可以在底层帮助完成两个文件描述符表(指针数组)的元素值拷贝。
  • 做两个整数的拷贝(fd)本质:文件描述符表(指针数组)下标fd对应的数组元素(指针)内容的拷贝。
  • dup2()  makes newfd be the copy of oldfd
  • 记忆:最后只会保留oldfd,也就是要重定向的内容
  • >和>>二者区别是:打开的方式选项不同清空&追加  O_TRUNC&O_APPEND
  • 重定向后 没有文件描述符指向的文件会被自动关闭。一个文件有两个文件描述符指向。
  • struct file内部会存在int ref_count(引用技术)
  • 文件有几个指向ref_count就是几个。为0的文件会自动关闭。
  • int ref_count(引用技术):就是有多少个指针指向文件对象。

  

【输出重定向>】

【追加重定向>>】

 

  •  shell进程在启动的时候,就会在/dev/pts创建设备文件。(默认打开的显示器/键盘等)
  • 若我们新打开一个窗口(终端),这个终端也是进程打开的设备文件,也会在/dev/pts目录下创建自己对应设备文件。(字符设备)Linux底下一切皆文件。
  • C语言编程使用printf时,默认会在当前进程所处的终端打印数据。(3号终端)
  • 新打开的终端是2号。将数据从3号终端重定向2号终端。

 

2.缓冲区

2.1什么是缓冲区

 所谓缓存区就是把数据临时放在一段内存空间里。

2.2为什么存在缓冲区

  •  计算机中存在很多缓冲区,既有用户级的缓冲区,又有内核级的缓冲区。每一种缓冲区都有自己特殊的作用。注❗缓冲区存在两种益处
  • 每一个文件都有一份自己的缓冲区❗

解耦:

  • 内核缓存刷新到外设:用户把数据交给OS的内核缓冲区,刷新到外设都不用管了。(语言和硬件解耦了)
  • 用户级缓存刷新到内核缓存:printf只需要把数据交给用户缓存区,不用管C语言怎么把数据刷新到内核的。(用户和系统解耦了)

提高效率(❗重点谈)提高效率是提高使用者的效率 

用户printf☞用户级缓存☞内核级缓存☞外设

  • 调用系统调用是有成本的(系统调用是需要OS配合,OS很忙的)所以少调用,效率就高。
  • 编程语言是需要注重用户体验的,只有把用户体验服务搞好了,才会有更多的人去使用这门语言。
  • 编程语言提供的接口,只需要把数据交给缓冲区,立刻旧可以返回。缓冲区的存在是提高使用者的效率。有缓冲区的存在,是提高printf/fprintf等接口的使用效率。
  • 编程语言的接口使用就会比较快(因为只是写道缓存中,没有到内核),用户体验好。
  • 使用语言提供的接口,在用户级缓存积累多次。等待OS配合一次性就刷新大量数据到内核,提高OS整体的效率。
  • 内核级缓存存在提供使用系统调用的人的体验(因为外设硬件很慢)
  • 语言为用户考虑,系统为语言考虑。
  • 综上:提高使用者的效率。提高刷新IO的效率。给上层提供高效的IO体验,间接提高整体的效率。

2.3缓冲区的刷新策略

  • 立即刷新: 相当于没有缓存,还多了一次拷贝(常见),数据立即从内核同步到外设。

  1. 语言:fflush

  2. 系统:man 2 fsync

  • 行刷新:显示器是行刷新。照顾用户的查看习惯。

  • 全缓冲:缓冲区满了才刷新。普通文件。

特殊情况:

  • 进程在退出时,无论是用户/内核级的缓存,系统和语言都会自动刷新。

  • 强制刷新(ffush/fsync)

  • 注❗:缓冲区的刷新策略和是 用户级缓冲区。内核级不关心。

  • 不同的平台对刷新的策略是不一样的

【进程退出:exit和_exit】

【进度条:\n和fflus】 

【看代码☞说明现象】

2.4查看源码

 

3.0/1/2

3.1 0/1/2是什么&为什么存在

  • 0:标准输入,键盘。
  • 1:标准输出,显示器。
  • 2:标准错误,显示器。
  • 程序需要和人交互的,所以必须要从特定的设备获取数据,对数据处理之后,输出结果。方便用户动态的获取数据和查看数据。

3.2 2和1区别

  • fd为1/2的都指向同一个显示器文件(往同一个终端打印)。
  • 当把数据往显示器上打印:一切正常。
  • 当把数据重定向到普通文件中:
  • 1号下标对应内容改变了,2号下标对应内容没有改变。
  • > 标准输出重定向,只会改变1号下标的对应的内容。标准输出会重定向,标准错误不会重定向。

【往显示器上打印】 

【输出重定向>】 

3.3 2为什么存在

  • 当编程的时候。会产生两类消息,正确的消息和错误的消息。为了区分这两类消息。
  • 正确的消息往1里面打印。错误的消息往2里面打印即可。
  • 只需要做一次重定向就可以把正确和错误的信息在文件层面上分开即可。

【就想把1和2要打印内容一起重定向一个文件中】

 

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

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

相关文章

Flutter 插件之http(介绍、使用、二次封装)

背景 在我们日常开发过程中,经常会使用到网络请求,而在Flutter插件中,最常用的请求插件一共两个,分别是: 1、dio 2、http 其中dio我已经做过详细介绍了(post、get等请求、文件上传、请求重试等),这里就不做过多阐述,下面附上文章链接,如有需要可前往查看。 http…

「11月·西安」第十二届信息系统与计算技术国际会议(ISCTech 2024)

随着信息技术的飞速发展,信息系统与计算技术已成为推动社会进步与产业升级的重要力量。在这样的背景下,第十二届信息系统与计算技术国际会议(ISCTech 2024)的召开,无疑为全球专家学者搭建了一个交流思想、共享成果的高…

ProfiNet 转 CAN/CANopen 网关

一、功能概述 1.1 设备简介 本产品是 PN(Profinet)和 COE(CANopen)/CAN(自由口)网关,使用数据映射 方式工作。 本产品在 PN 侧作为 PN IO 从站,接西门子 PLC;在 COE 侧做为 COE 主站, 接 COE 设备,如伺服、变频器、…

漏洞挖掘 | edusrc记一次某中学小程序渗透测试

一、搜集渗透目标 现在的EDU挖web端的上分效率远不如小程序,因此这篇文章浅浅记录一次小程序的挖掘吧。如果各位大牛想要快速出洞,不妨跳过大学,学院等小程序,而重点关注小学、中学、幼儿园等,这些小程序的出洞率还是…

第L3周:机器学习|逻辑回归

本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 | 接辅导、项目定制 🚀 文章来源:K同学的学习圈子深度学习第J6周:ResNeXt-50实战解析 1.逻辑回归定义 逻辑回归(Logistic Re…

hive udf去掉map中的一个或者多个key

实现一个hive udf,可以将Map中的某一个或者多个key去掉,这里要继承GenericUDF 这个抽象类,然后Override evaluate这个函数即可,可以把执行这个udf前初始化的一些内容放在initialize方法内,比如参数的判断,函数的返回值类型等等。 代码写好之后,可以用如下方法创建这个函…

Golang之OpenGL(一)

使用OpenGL实现窗口中绘制三角形(纯色|彩色)、正方形(变色) 一、简单实现窗口绘制三角形二、绘制的多颜色三角形(基于 ‘ 简单实现窗口绘制三角形 ’ )1、在顶点着色器和片段着色器中添加了颜色的输入和输出…

【考研高数】反函数的那些事

在这里给同学们推荐来自「荒原之梦考研数学」网的三篇文章,分别是反函数的性质汇总,以及两道相关习题,有需要加强这部分练习的同学,可以长按下方二维码,在「荒原之梦考研数学」官网中打开对应的文章: 《反…

基于单片机的防火防盗报警系统设计

摘要: 该多功能防火防盗系统既具有根据环境温度和烟雾浓度进行火灾检测的功能,也有能对人体检测实现防盗的功能。多功能智能防火防盗控制系统的主控制器是 STC89C52 单片机,环境温度的检测采用 DS18B20 , MQ2 检测烟雾浓度&…

利用canvas 实现图片的标注,把标注像素点传入到后端

背景:我们有一个摄像的产品,拍照传统的水表盘面,我们需要框选水表读数,标注点传到后端,后端根据标注点自动去截取摄像表拍摄回来的图片,然后拿到大模型里面进行训练。由于同一只表拍摄的画面都是一样的&…

C语言之指针函数与函数指针

目录 1 前言2 函数指针与指针函数理解与区分函数指针指针函数 3 函数指针与指针函数常见用法函数指针指针函数 4 总结 1 前言 项目中时常遇到指正函数与函数指正的使用,时间一长容易出现概念混淆。 2 函数指针与指针函数理解与区分 函数指针 原型:返回…

React 项目中如何使用 easyPlayer-pro.js

目录 背景EasyPlayer.js H5播放器简单介绍EasyPlayer.js 简介EasyPlayer.js 功能说明:配置属性事件回调方法 下载 EasyPlayer.js引入使用重写webpack问题处理证清白最后 背景 项目中要使用 easyplayer-pro.js 播放视频,查了下资料,网上基本都…

Axure在数据可视化原型设计中的革新力量

在数据洪流与信息爆炸的当下,产品设计不再局限于界面的美观与功能的堆砌,而是更多地聚焦于如何高效地呈现与解读数据。Axure RP,作为原型设计领域的璀璨明星,正以其独特的魅力,引领着数据可视化原型设计的新风尚。本文…

【云原生】数据库忘记密码怎么办?

相信很多人都会遇到在虚拟机中忘记数据库密码的情况,想必大家都很苦恼,所以今天给大家来讲讲数据库忘记密码了如何修改密码再登录数据库!!! 1、关闭数据库服务 systemctl stop mariadb 2、执行MySQL 服务器在启动时跳…

【LeetCode】146.LRU页面置换

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

C++ string类(你想要的这里都有)

1. string类概述 C语言中&#xff0c;字符串是以“\0”结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户管理&#…

Javaweb项目|ssm基于web的健身中心管理系统的的设计与实现jsp

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于ssm基于web的健身中心管理系统的的设计与实现jsp 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、…

HTTP常见的请求方法、响应状态码、接口规范介绍

常见的请求方法 GET&#xff08;查询&#xff0c;从服务器获取资源&#xff09;POST&#xff08;新增&#xff0c;在服务器创建资源&#xff09;PUT&#xff08;修改&#xff0c;在服务器更新资源&#xff09;DELETE&#xff08;删除&#xff0c;从服务器删除资源&#xff09;…

跟《经济学人》学英文:2024年07月27日这期 AI firms will soon exhaust most of the internet’s data

AI firms will soon exhaust most of the internet’s data Can they create more? 原文&#xff1a; In 2006 fei-fei li, then at the University of Illinois, now at Stanford University, saw how mining the internet might help to transform AI research. Linguis…

商场购物中心营销怎么玩?附230个参考案例

随着消费市场的不断演变&#xff0c;商场购物中心正面临着前所未有的竞争压力。如何在众多竞争对手中脱颖而出&#xff0c;吸引消费者的目光&#xff1f; 今天道叔将探讨商场购物中心营销的新玩法&#xff0c;帮助您在激烈的市场竞争中占据一席之地。 码字不易&#xff0c;如…