1652_MIT 6.828 shell例程重定向的实现分析

         全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         前面完成了一个单独命令执行之后,想放弃这个简单shell的实现。后来想想多少还是有几分不甘心,还是耐着心思把这个做完吧!

         这次,看一下重定向的相关实现。这部分实现,我是参考了一些其他人的实现来做了一个简单的调试。

         这是重定向部分的实现,关键点还是几个文件操作接口的应用。而这几个应用,在之前已经单独做了梳理。

         至于这个重定向的处理,首先我们得回顾一下之前看到的重定向的代码实现部分。

         在重定向的过程中,原来的命令通过一个cmd的成员进行了封装存放。文件也是继续绑定之前的文件。而这里的flags的处理则是根据究竟是输入还是输出导向进行了一个操作属性的设置。同时,重定向借用的是标准输入以及标准输出两个特殊的文件描述符。这里也根据重定向的属性进行了fd的分配。

         由此,当我们回到上面的重定向的case处理分支中的时候,相应的文件描述符的信息就应该有一个清晰的概念了。其实,通过反复的处理这里实现的处理只是巧妙地新创建文件描述符并且关闭之前的文件描述符来做一个概念上的切换。这个概念是如何进行的切换呢?首先,通过新的open操作来对原来的文件进行了对等的flags等操作绑定了新的文件描述符。接着,关闭了原来的文件绑定的文件描述符,而这个绑定其实是标准的输入输出。接下来,通过dup分配了一个全新的文件描述符,这个文件描述符有着跟前面的open对等的一个处理效果。仅仅通过这些信息可能还是有点漏洞,那么这样的漏洞是如何补充起来的呢?那就是这个命令的解析其实是发生在一个全新的子进程中!因此,在这段处理执行之前,其实文件描述符是一个未使用状态。如此,输入会被关联到标准输入输出以及错误之外的文件描述符上,也就是从3开始。但是,dup的行为又较为特殊。只要是没有使用的文件描述符都是可以分配的。因此,如果当前已经在工作的是标准输入,那么文件将会被绑定到标准输出上。而当前工作的假如是标准输出,文件则会被绑定的标准输入上。如此,也就实现了重定向。

         关于这部分,我们可以通过增加一个输出打印来看看具体的分析猜测。

         代码中增加这样的一个输出,之后测试一下输入输出的重定向。

         从上面的结果看,这个还是跟分析的内容一致的。

重定向处理的是相关的文件,而文件处理完之后还需要按照普通的方式进行命令的调用。这也就是最后一个命令调用实现的功能了。

管道命令的实现基本上也是这样的技巧,这里就不去深入分析了。

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

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

相关文章

基于pytorch+Resnet101加GPT搭建AI玩王者荣耀

本源码模型主要用了SamLynnEvans Transformer 的源码的解码部分。以及pytorch自带的预训练模型"resnet101-5d3b4d8f.pth"本资源整理自网络,源地址:https://github.com/FengQuanLi/ResnetGPT注意运行本代码需要注意以下几点 注意!&a…

多线程控制讲解与代码实现

多线程控制 回顾一下线程的概念 线程是CPU调度的基本单位,进程是承担分配系统资源的基本单位。linux在设计上并没有给线程专门设计数据结构,而是直接复用PCB的数据结构。每个新线程(task_struct{}中有个指针都指向虚拟内存mm_struct结构&am…

你真的掌握到“优先级队列“的精髓了吗?

前文如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。一,priority_…

QT/C++调试技巧:内存泄漏检测

文章目录内存泄漏方案一方案二:CRT调试定位代码位置方法1方法2其它问题方案三:使用vs诊断工具方案四:使用工具VLD(Visio Leak Detector)方案五Cppcheck内存泄漏 内存泄漏:指的是在程序里动态申请的内存在使…

STM32学习(八)

STM32串口与电脑USB口通信 特别注意:两个设备之间的TXD和RXD,必须交差连接,方可正常通信 RS-232异步通信协议 启动位:必须占1个位长,必须保持逻辑0电平。有效数据位:可选5、6、7、8、9个位长,L…

【嵌入式烧录/刷写文件】-1-详解Motorola S-record(S19/SREC/mot/SX)格式文件

目录 1 什么是Motorola S-record 2 Motorola S-record的格式 2.1 Motorola S-record的结构 2.1.1 “Record type记录类型”的说明 2.1.2 “Record length记录长度”的说明 2.1.3 如何计算“Checksum校验和” 2.2 Record order记录顺序 2.3 Text line terminator文本行终…

HTTP/2.x:最新的网页加载技术,快速提高您的SEO排名

2.1 http2概念HTTP/2.0(又称HTTP2)是HTTP协议的第二个版本。它是对HTTP/1.x的更新,旨在提高网络性能和安全性。HTTP/2.0是由互联网工程任务组(IETF)标准化的,并于2015年发布。2.2 http2.x与http1.x区别HTTP…

spring5(三):IOC操作Bean管理(基于xml方式)

IOC操作Bean管理(基于xml方式)前言一、基于 xml 方式创建对象二、基于 xml 方式注入属性1. 使用 set 方法进行属性注入2. 使用有参数构造进行属性注入3. p 名称空间注入简化操作(了解)三、xml 注入其它类型属性1. 字面量2. 注入属…

【云原生之企业级容器技术 Docker实战一】Docker 介绍

目录一、Docker 介绍1.1 容器历史1.2 Docker 是什么1.3 Docker 和虚拟机,物理主机1.4 Docker 的组成1.5 Namespace1.6 Control groups1.7 容器管理工具1.8 Docker 的优势1.9 Docker 的缺点1.10 容器的相关技术1.10.1 容器规范1.10.2 容器 runtime1.10.3 容器管理工具…

看齐iOS砍掉祖传功能,Android 16G内存也危险了

手机内存发展是真的迅速,12GB 没保持几年现在又朝着 16GB 普及。 相比 iOS 的墓碑机制,Android 后台就主打一个真实,只是可惜 APP 不那么老实。 如果你较早接触 Android 机,各种系统管理、优化 APP 的一键加速、清理应该还历历在…

AD9235芯片手册阅读笔记

特征 单个3 V电源操作(2.7 V至3.6 V) SNR70 dBc至65 MSPS时的奈奎斯特 SFDR85 dBc至65MSPS时奈奎斯特低功率: 300 mW至65 MSPS差分输入,带500 MHz带宽 片上参考和SHA DNL0.4 LSB 灵活模拟输入:1 V p-p至2 V p-p范围 偏…

Python的加密与解密,你知道几类?

人生苦短,我用python python 安装包资料:点击此处跳转文末名片获取 据记载, 公元前400年, 古希腊人发明了置换密码。 1881年世界上的第一个电话 保密专利出现。 在第二次世界大战期间, 德国军方启用“恩尼格玛”密码机&#xff0…

[数据结构] 用两个队列实现栈详解

文章目录 一、队列实现栈的特点分析 1、1 具体分析 1、2 整体概括 二、队列模拟实现栈代码的实现 2、1 手撕 队列 代码 queue.h queue.c 2、2 用队列模拟实现栈代码 三、总结 🙋‍♂️ 作者:Ggggggtm 🙋‍♂️ 👀 专栏&#xff1…

入职第一天就被迫离职,找工作多月已读不回,面试拿不到offer我该怎么办?

大多数情况下,测试员的个人技能成长速度,远远大于公司规模或业务的成长速度。所以,跳槽成为了这个行业里最常见的一个词汇。 前言 前几天,我们一个粉丝跟我说,正常入职一家外包,什么都准备好了&#xff0…

Portainer堪称最优秀的容器化管理平台

一、Portainer是什么? Portainer是一款开源的容器管理平台,支持多种容器技术,如Docker、Kubernetes和Swarm等。它提供了一个易于使用的Web UI界面,可用于管理和监控容器和集群。Portainer旨在使容器管理更加简单和可视化&#xf…

WinForm | C# 界面弹出消息通知栏 (仿Win10系统通知栏)

ApeForms 弹出消息通知栏功能 文章目录ApeForms 弹出消息通知栏功能前言全局API通知栏起始方向通知排列方向通知栏之间的间隔距离无鼠标悬停时的不透明度消息通知窗体的默认大小示例代码文本消息提示栏文本消息提示栏(带选项)图文消息提示栏图文消息提示…

【Spring-boot源码剥析】| 启动原理之侠客行篇

目录一. 传说篇二. 快速启动原理三. 自动配置原理3.1 准备阶段3.2 配置阶段3.3 运行阶段三. Pefect Ending一. 传说篇 江湖传说,有一个神秘的江湖大侠,他名叫SpringBoot,擅长于开发出快速启动的应用程序。这个侠客的江湖名号传遍了整个江湖&a…

did not find expected key while parsing a block mapping at line 2 column 1的解决方法

问题描述 真的是困扰了好久的一个问题&#xff0c;真的是邪乎了&#xff0c;报的错误实际上是错的 完整报错&#xff1a; Error: YAML Exception reading /path_to_your_blog/_publications/2020-08-21.md: (<unknown>): did not find expected key while parsing a b…

JQuery

概述&#xff1a; JQuery&#xff1a;JavaScript和查询&#xff0c;他是辅助JavaScript开发的js类库。 他的的核心思想就是write less&#xff0c;do moire 实现了很多浏览器兼容问题 JQuery的核心函数 $(参数) 1 参数是函数&#xff1a;$(function(){}) window.onlooad fun…

AI风暴 :文心一言 VS GPT-4

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 文心一言 VS GPT-4 文心一言&#xff1a;知识增强大语言模型百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#…