Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)

Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)

  • 前言
  • 一、文件描述符fd的分配规则
  • 二、输出重定向(>)
  • 三、输出重定向底层实现原理
  • 四、追加重定向(>>)
  • 五、输入重定向(<)
  • 六、系统调用dup2
  • 七、标准错误stderr存在意义

前言

 在Linux中,操作系统会为每一个文件创建对应的描述结构体对象struct file。该结构体中一定存在3个部分:打开文件的所有属性、文件的操作集、文件缓冲区(内存)。其中由于冯诺依曼体系决定了,无论对文件进行读操作还是写操作,都需要先将数据加载到文件缓存区

 我们在应用层进行对数据读写的操作本质上是用户缓冲区和内核数据缓冲区之间的相互拷贝!!!

一、文件描述符fd的分配规则

  1. 默认情况下,进程会默认打开3个文件:标准输入、标准输出、标准错误。
  2. 文件描述符的分配规制是:从上往下遍历查找最小的、未被使用的分别个新的文件!

二、输出重定向(>)

 下面我们将标准输出文件关闭,然后创建新的文件;并向新的文件中输出一些信息。

int main()
{close(1); //将标准输出文件显示器关闭int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);//新创建文件,fd分配为1    if(fd < 0)    {    perror("open");    return 1;                                                         }    printf("what will happen\n");    return 0;
}

在这里插入图片描述

  • 我们将stdout关闭后,根据文件描述符的分配规则,新创建的文件fd为1。
  • 我们观察结果发现,原本应该向显示器打印的消息直接向新创建的文件中写入。我们将这种现象称为输出重定向>!!

三、输出重定向底层实现原理

 在C中,printf函数只能向标准输出文件中输出消息,更准确的说:printf只认文件描述符为1对应的文件

 当我们关闭标准输出后,新创建的文件所分别的文件描述符fd为1。此时文件描述符表中,下标为1的数组内容由标准输出替换为新打开的文件log.txt。此时我们调用printf输出消息时,变为向log.txt文件中写入!!

所有重定向的本质就是修改特定文件fd的下标内容!!上层fd不变,下层fd指向的内容发生改变!
在这里插入图片描述

四、追加重定向(>>)

 追加重定向和输出重定向基本相同,主要在于新创建文件的打开方式从w改为a。在底层上和输出重定向一样,都是将fd为1的下标内容替换为新文件即可!!!

int main()
{close(1); //将标准输出文件显示器关闭int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);//新创建文件,fd分配为1    if(fd < 0)    {    perror("open");    return 1;                                                         }    printf("what will happen\n");    return 0;
}

在这里插入图片描述

五、输入重定向(<)

 输入重定向<本质就是将待重定的文件内容替换到fd为0的下标位置。此时我们熟悉的scanf、fputs等函数读取方式会从键盘转变为新文件。即直接读取新文件中的内容

int main()
{close(0);   //将显示器关闭                                                          int fd = open("log.txt", O_RDONLY); //新创建文件fd为0if(fd < 0)    {    perror("open");    return 1;    }    char buffer[1024];    fread(buffer, 1, 1024, stdin);//从文件log.txt中读写信息    printf("stdin->fd:%d, %s\n", stdin->_fileno, buffer); return 0;
}

在这里插入图片描述

  • 在上述代码执行过程中,没有出现光标等待我们从键盘上输入信息,而是直接将log.txt中的信息输出,进一步说明了fd为0的下标内容被替换。

六、系统调用dup2

 上述进行重定向时时进行的fd指向的内容替换,都需要我们手动先将对应的1、2、3号文件关闭,非常麻烦!为此,系统中提供了相关的系统调用接口:dup2

#include <unistd.h>
int dup2(int oldfd, int newfd);//These system calls create a copy of the file descriptor oldfd

【实例】:

int main()
{int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);dup2(fd, 1);printf("this is log.txt test\n");  return 0;
}

在这里插入图片描述

七、标准错误stderr存在意义

 标准输出和标准错误都是向显示器上打印信息。既然都是向同一个硬件进行写入,为什么还需要标准错误的存在?

 在项目实际运行过程中,bug是不可避免的。所以在日志中会记录很多正确信息和错误信息。而stderr存在的意义是将两者信息分开,将所有的错误信息全部写入标准错误文件中,从而降低排除的成本!!

【实例】:

  • 下面我们通过输出hello stdinhello Stderr来模拟日志中的正确信息和错误错误信息!
int main()
{fprintf(stdout, "hello stdin\n");                                                       fprintf(stderr, "hello Stderr\n");}

我们情况下,两者都在显示器上直接输出

在这里插入图片描述


我们也可以通过替换fd=1fd=2的下标对应文件,来将两者信息分开,分别向两个文件中写入
在这里插入图片描述

  1. 我们也可以将两种信息全部打印到同一个文件中:1>log.txt 2>&1。 这段代码的意思是先用log.txt文件fd中的内容替换fd=1下标中的内容,然后&1获得下标fd=1中保存的数据(即指向log.txt),最后将fd=2对应的内容用fd=1中的内容替换!!即fd=1fd=2都指向了log.txt文件。
  2. 前面讲述的输入重定向、输出重定向、追加重定向都是简写的,原始版本应该和上面重定向一样,加上对应的fd。例如输出重定向./myfile > log.txt./myfile 1 > log.txt简写。

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

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

相关文章

关于 vs2019 c++20 规范里的 STL 库里模板 decay_t<T>

&#xff08;1&#xff09; 这个模板&#xff0c;在库代码里非常常见。 decay 英文是“衰弱&#xff0c;消减” 的意思&#xff0c;大概能感觉到就是要简化模板参数 T 的类型&#xff0c;去掉其上的修饰符。因为常用且复杂&#xff0c;故单独列出其源码和注释。先举例其应用场景…

基于Springboot的学生心理压力咨询评判(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的学生心理压力咨询评判&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

PS滤镜插件Camera Raw 15.4升级,开启智能修图

前段时间Adobe 更新了photoshop 的智能AI填充功能&#xff0c;深受很多设计师朋友的喜爱。Camera Raw作为PS的一个滤镜插件对RAW图片的处理上面有一定的优势&#xff0c;Camera Raw 15.4升级了&#xff0c;开启智能修图木事&#xff0c;一起来看看吧&#xff01; Camera Raw滤镜…

【2024华为HCIP831 | 高级网络工程师之路】刷题日记(18)

个人名片&#xff1a;&#x1faaa; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&a…

ClassificationPrimitive 内部原理

ClassificationPrimitive 内部原理 发明 ClassificationPrimitive的真是个天才。其原理是利用 webgl 的模板缓冲区实现。 渲染两次, 首先是绘制模板, 然后绘制真正的内容。 示意图: function createClass() {const { program, uniforms } WebGLProgram.buildPrograms(gl, …

代码随想录算法训练营第36期DAY22

DAY22 654最大二叉树 自己做的时候忽略了&#xff1a;nums.length>1的题给条件。所以每次递归都要判断是否size()>1&#xff0c;不要空的。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig…

牛客网刷题 | BC84 牛牛学数列2

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 这次牛牛又换了个数…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

《海峡科技与产业》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《海峡科技与产业》期刊是什么级别&#xff1f; 答&#xff1a;国家级 主管单位&#xff1a;中华人民共和国科学技术部 主办单位&#xff1a;科技部海峡两岸科学技术交流中心 问&#xff1a;《海峡科技与产业》影响因子&#xff1f; 答&#xff1a;…

随笔:棋友们

我是在小学二年级学会中国象棋的&#xff0c;准确说&#xff0c;是学会象棋的下棋规则的&#xff0c;师傅是二舅。我最早的对手就是同学波仔。波仔比我略早学会象棋&#xff0c;总用连珠炮欺负我&#xff0c;开局几步棋就把我将死。我不知道怎么破解。轮到我先走时&#xff0c;…

扭亏为盈的赛力斯,真正进入稳态了吗?

“72小时内大定破1万台”。5月15日&#xff0c;问界新M5开启全国大规模交付&#xff0c;从当前取得的成绩来看&#xff0c;赛力斯的“富贵”似乎还将延续。 其实&#xff0c;此前基于问界新M7等车型的爆火&#xff0c;赛力斯已经找到了创收轨道。财报显示&#xff0c;2024年一…

alist网盘自动同步

alist网盘自动同步 alist可以设置目录定时转存到各个网盘&#xff0c;做到夸网盘&#xff0c;多备份的效果可以将自己挂载的alist 下的各个目录相互间进行同步&#xff0c;原理是采用alist原始api调用执行同步原理1.匹配文件名称是否相同,2.文件大小是否相同&#xff0c;相同会…

一文详细解析Google编码规范工具cpplint的下载安装与使用

目录 一、什么是cpplint 二、cpplint能实现的功能 三、cpplint的下载与使用 1、配置python环境 2、安装cpplint 四、cpplint常用命令讲解 1、常用命令查看 2、常用命令详解 3、命令使用方式 五、 cpplint的实用技巧 1、集成cpplint 1.1、修改调用接口. 1.2、直接把…

数据结构(C):树的概念和二叉树初见

目录 &#x1f37a;0.前言 1.树概念及结构 2.认识一棵树 3.树的表示 3.1树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 4.二叉树 4.1特殊的二叉树 4.2二叉树的性质 &#x1f48e;5.结束语 &#x1f37a;0.前言 言C之言&#xff0c;聊C之识&…

卷积模型的剪枝、蒸馏---蒸馏篇--NST特征蒸馏(以deeplabv3+为例)

本文使用NST特征蒸馏实现deeplabv3+模型对剪枝后模型的蒸馏过程; 一、NST特征蒸馏简介 下面是两张叠加了热力图(heat map)的图片,从图中很容易看出这两个神经元具有很强的选择性:左图的神经元对猴子的脸部非常敏感,右侧的神经元对字符非常敏感。这种激活实际上意味着神经…

C++ 日志库 log4cpp 编译、压测及其范例代码 [全流程手工实践]

文章目录 一、 log4cpp官网二、下载三、编译1.目录结构如下2.configure 编译3.cmake 编译 四、测试五、压测源码及结果1.运行环境信息2.压测源码3.压测结果 文章内容&#xff1a;包含了对其linux上的完整使用流程&#xff0c;下载、编译、安装、测试用例尝试、以及一份自己写好…

IT革新狂潮:引领未来的技术趋势

方向一&#xff1a;技术革新与行业应用 当前现状&#xff1a; 量子计算&#xff1a;量子计算的研究正在加速&#xff0c;尽管目前仍处于初级阶段&#xff0c;但其在药物研发、加密技术和材料科学等领域的应用潜力已被广泛认可。 虚拟现实&#xff08;VR&#xff09;与增强现实…

湖南大学OS-2018期末考试(不含解析)

前言 不知道哪里翻出来的一张&#xff0c;看着确实像期末考卷&#xff0c;暂且放一下。或许做过&#xff0c;或许没做过。 总之答案不记得了。做完可以评论区发一下或者找我发出来。 共6道大题。 一、(30%) 1. &#xff08;6%&#xff09; 进程间通信的两种方法分别是什么&…