Linux之自主实现minishell重定向功能

【C++与Linux基础】文件篇(3)-fd的本质和minishell的重定向功能 本文主要介绍了Linux文件描述符(fd)的底层原理和重定向的实现。首先讲解了fd本质是进程打开文件数组的下标,以及其"最小可用"的分配特性。通过代码示例演示了关闭标准输出后,新打开文件会占用fd=1的位置,实现输出重定向的效果。然后详细解析了dup2系统调用的使用方法,通过将文件描述符复制到标准输出实现重定向功能。最后提到将利用这些知识完善minishell,使其支持输入输出重定向功能。文章通过图示和代码示例帮助理解Linux文件系统的底层机制。 阅读详情

今天分享关于Linux下自主实现minishell重定向功能:
1.首先重定向是什么意思呢?
Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作,操作句柄为文件描述符,可以将文件描述符想象成两个指针,相当于指针所指的内容变了。
2.Linux下常用的shell重定向
当执行shell命令时,会默认打开3个文件,系统为这三个文件分配了文件标识符fd:

类型文件描述符默认情况
标准输入(stdin)0从键盘获得输入
标准输出(stdout)1输出到屏幕
标准错误(stderr)2输出到屏幕

常用到的两个输出重定向的符号">" 和 “>>”
第一个是清空重定向,会先清空文件的原有内容再向其中添加内容。
第二个属于追加重定向,直接在文件原有内容的末尾追加内容。
如果文件不存在都会先创建一个文件 !

看到这里我想你应该对重定向有个初步的认识了,那么现在就来实现下minishell的重定向,首先打开xshell6。
分析下重定向时需要你用拆解字符串的方式解析下用户输入的字符串,判断字符串的内容中是否有>或者>>这两个符号。
这里我就只给出关于重定的代码实现部分,其他的请看我的另一篇文章:
https://blog.youkuaiyun.com/Python_programer/article/details/89056198
函数部分代码实现如下:

 51 char* redirect_file = NULL;
 52 int do_redirect()              //重定向符判断
 53 {
 54     redirect_flag = 0;         //定义这个标记来区别>和>>
 55     redirect_file = NULL;      //
 56     char* ptr = buf;
 57     while(*ptr!='\0'){
 58         if(*ptr=='>'){
 59             redirect_flag = 1;
 60             *ptr='\0';
 61             ptr++;
 62             if(*ptr=='>'){
 63                 redirect_flag = 2;
 64                 *ptr='\0';
 65                 ptr++;
 66             }
 67             while(*ptr!='\0'&&isspace(*ptr)){   //走完空格
 68                 ptr++;
 69             }
 70             redirect_file = ptr;               //用redirect_file指针记录要重定向到的位置是在哪
 71             while(*ptr!='\0'&&!isspace(*ptr)){ //走完非空的字符
 72                 ptr++;
 73             }
 74             *ptr='\0';                         //走完一个非空字符串后加上\0          
 75         }
 76         ptr++;                                  //继续向下走
 77     }
 78     return 0;
 79 }

主函数内相关部分:

102         int pid = fork();        //这个任务当然是交给子进程完成啦
103         if(pid<0){ //创建子进程失败,则继续创建,因为用户还要继续输入指令
104             printf("fork error!");
105             continue;
106         }
107         else if(pid==0){
108             int fd = 1;
109             if(redirect_flag == 1){       //如果是一个 <,则进行清空重定向
110                 fd = open(redirect_file,O_WRONLY|O_CREAT|O_TR    UNC,0664);         //以只读方式,文件不存在则创建以及清空方式打开,后面的权限可以自己来定
111                 if(fd<0){
112                     exit(-1);             //打开失败直接退出
113                 }
114             }
115             else if(redirect_flag == 2){   //如果是一个 <<,则进行追加重定向
116                 fd = open(redirect_file,O_WRONLY|O_CREAT|O_AP    PEND,0664);            
117                 if(fd<0){
118                     exit(-1);
119                 }
120             }
121             dup2(fd,1);       //将标准输出重定向到fd所指位置 

完整的解析如上,重定向关键就是需要先判断是>还是>> ,然后记录下重定向符号后要重定向的位置,还有就是拆分用户输入命令为一个个字符串来解析!
下面来运行下我们所实现的代码:
在这里插入图片描述
将ls的结果清空的方式重定向到b.txt中,然后打开b.txt中可以看到结果,从而简单的实现了一个重定向的功能。
在这里插入图片描述

多相机标定与单应变换:用OpenCV实现BEV俯视全景图 多路监控画面分散在不同屏幕,难以快速理解全局空间关系。通过相机标定与畸变校正,利用单应矩阵将各视角图像投影到统一的地面坐标系,即可合成BEV鸟瞰全景图。该技术是车载360°环视系统和自动驾驶BEV感知的雏形,也适用于场地安防与移动机器人导航。基于Python+OpenCV的四路相机实现,完整覆盖标定、投影变换、多路羽化融合与实时优化,为多视角拼接和俯视全景图项目提供可复现的工程参考。 阅读详情

相关推荐

四十二、Fluent欧拉模型流化床模拟:从基础设置到颗粒动力学解析

本文详细解析了Fluent欧拉模型在流化床模拟中的应用,从基础概念到颗粒动力学设置全面覆盖。重点介绍了欧拉模型的颗粒温度概念、多相流配置技巧以及关键参数优化策略,帮助工程师准确模拟气固两相流动现象。通过实用案例演示了网格检查、求解器配置和边界条件设置的最佳实践。

weixin_27303545的博客 445

模拟实现shell,使它支持重定向功能

我们都知道用户是通过操作系统来对我们的硬件或者软件进行操作的,但是我们平时在使用计算机的时候并没有直接与操作系统进行交流。而在linux下我们通常通过终端输入命令,但是你有没有想过为什么我们在终端输入命令,操作系统就能认识呢?这中间存在一个命令行解释器shell,也就是所谓的外壳程序,来对我们输入的命令进行解释,调用相关的系统调用接口,从而实现各种操作。在这里我们就来模拟一个shell。要模拟sh...

qq_40995354的博客 887

软考中级-系统集成项目管理工程师**的超详细知识点笔记。

软考中级系统集成项目管理工程师核心知识点摘要 综合知识:涵盖信息化基础(国家信息化六要素、信息系统开发方法)、系统集成特点(高技术性、团队协作)、IT服务管理(ITIL流程)、网络技术(OSI模型、TCP/IP)、信息安全(CIA三要素、加密技术)、软件工程(生命周期、测试类型)、面向对象分析与设计(UML图)、新一代信息技术(云计算、大数据、物联网)。 案例分析:聚焦项目管理十大知识领域,重点包括: 整体管理(项目章程、变更控制流程) 范围管理(WBS分解、需求跟踪矩阵) 进度管理

最爱で毛毛熊的博客 1990

linux实现一个简易的minishell

今天分享linux下实现一个简易的minishell程序: 我使用的xshell6写的程序,不知为什么就是看不惯centos6的黑框框,,, 通常连接xshell6后进入就是如下图所示: 用户可以输入一系列指令然后会将结果显示出来,如上图所示 所以要写一个简易shell需要遵循以下过程: 1.获取命令行 2.解析命令行 3.建立一个子进程(fork) 4.替换子进程(execvp) 5.父进程等...

Python_programer的博客 745

群晖NAS变身私有Git服务器:DS218+部署与TortoiseGit客户端实战指南

本文详细介绍了如何将群晖NAS(如DS218+)变身为私有Git服务器,并配置TortoiseGit客户端实现高效代码管理。通过硬件检查、系统更新、Git Server套件安装及权限配置等步骤,帮助开发者在局域网内搭建安全、高速的代码托管环境,特别适合小团队协作。

weixin_29252171的博客 223

别再手动调参了!用Optuna+PyTorch搞定Transformer时序预测超参数(附完整代码)

本文详细介绍了如何利用Optuna和PyTorch实现Transformer时序预测模型的自动化超参数调优。通过贝叶斯优化技术,显著提升单变量时序预测的效率和准确性,并附有完整代码实现。文章涵盖模型架构设计、数据预处理、Optuna调参实战及生产环境部署建议,为开发者提供一站式解决方案。

weixin_33704234的博客 576

实现一个简单的minishell

shell是什么? shell是一个程序----打开一个终端运行的程序----命令解释行程序,运行在终端之上,捕捉用户的输入;然后决定要运行哪个shell命令程序 流程 捕捉键盘输入 scanf/gets 获取到键盘输入的数据 — [ ls -l -a ] 字符串格式解析 — 以空白字符作为间隔,分割成为一个个的字串, 去掉空白字符 char tmp[1024] = " ls -l -a"; char *ptr = tmp; char *argv[32] = {NUL

weixin_45636889的博客 289

【星火】海思HI3516C开发板实战:基于LVGL与MPP库的行车记录仪/电子显微镜方案

本文详细介绍了基于海思HI3516CV500开发板,结合LVGL图形库与海思MPP媒体处理平台,实现行车记录仪与电子显微镜方案的完整实战过程。内容涵盖从系统环境搭建、驱动配置到应用开发的全流程,重点解析了MPP视频流处理管道与LVGUI界面协同工作的核心机制,为嵌入式音视频开发提供了可复用的参考方案。

weixin_42126677的博客 160

Linux_minishell的重定向实现

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <sys/wait.h> int main() { w...

分享C语言,linux相关知识 186

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

YOLO26改进策略【损失函数篇】| AAAI 2025 SD Loss,基于目标尺度动态调整尺度损失和位置损失的影响系数,减少 IoU 标签波动

在红外小目标检测任务里,基于交并比的损失存在波动问题,像边界框(BBox)标签的IoU损失波动最高可达86%,较小目标的IoU损失稳定性更差,严重影响模型稳定性和回归效果。同时,现有损失函数没有充分考虑不同目标尺度下对尺度和位置的敏感度差异,,并且掩码标签的位置损失在处理漏检物体时难以收敛,容易产生误报。这些问题限制了模型在不同尺度目标上的检测性能,为解决这些问题,提出了损失函数。

Limiiiing的博客 396

自动实现一个minishell更新(增加重定向功能)

增加重定向功能 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <fcntl.h> 6 #include <sys/types.h> 7 #includ...

boke_fengwei 293

YOLO26改进策略【YOLO和Mamba】| CVPR 2025:EfficientViM 压缩隐藏状态空间进行通道混合、单头设计减少内存操作,提升目标检测效率与精度

本文记录的是利用模块优化的目标检测网络模型。EfficientViM Block(基于隐藏状态混合器的状态空间对偶性模块) 的设计旨在,提升特征提取效率,同时兼顾全局依赖捕捉与局部细节保留。本文将深入研究的原理,并将其应用到中,通过重构特征提取流程、减少内存绑定操作、融合多阶段特征,增强模型在资源受限环境下的检测性能与速度。EfficientViM: Efficient Vision Mamba with Hidden State Mixer based State Space DualityEfficie

Limiiiing的博客 399

Linux为自主实现的minishell添加重定向的功能(>> / >)

重定向符号 >> :追加重定向(在文件原有内容后追加新添加的内容) >:清空重定向(清空文件原有内容,添加新内容) ls -a >> test.txt 捕捉用户键盘输入 1.1 解析重定向(判断有没有 > 符号) 1.2 将重定向符号之前的信息按照以前的命令处理方式进行处理 1.3 取出重定向的文件名称 解析输入(得到命令名称+参数) 创建子进程 3.1 在程序替换之前进行标准输出重定向到指定的文件(open,dup2) 4.在子进程进行程序替换 5.父进程进程等待 #include&

ygtrece_13的博客 167

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux 文件描述符与重定向实战:从原理到 minishell 实现

文件描述符(fd)是 Linux IO 的核心概念,所有文件操作最终都通过文件描述符完成;而重定向(>、>>、<)则是基于文件描述符的经典应用,是 Shell 的核心功能之一。理解文件描述符的分配规则、重定向的底层原理,不仅能帮你搞懂 Linux IO 的本质,还能轻松实现自定义 Shell 的重定向功能。本文从文件描述符的本质、分配规则,到重定向原理,最后落地到 minishell 的重定向功能实现,全程用实战代码验证,让你彻底吃透这两个关键知识点。

会当凌绝顶,一览众山小 2741

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux中添加重定向(Redirection)功能到minishell

重定向是shell中用于改变命令输入输出流向的重要功能。ls>>O_RDONLY通过正确理解这些概念和实现步骤,就可以在minishell中完整地支持输入输出重定向功能。

Made In SQL 804

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

自主minishell代码中实现重定向符号功能

1,重定向 重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作,操作句柄为文件描述符,可以将文件描述符想象成两个指针,相当于指针所指的内容变了。 stdin(标准输入) 0 从键盘获得输入 stdout(标准输出) 1 ...

晴天的博客 275

minishell的重定向实现

minishell的重定向实现 Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作,操作句柄为文件描述符,可以将文件描述符想象成两个指针,相当于指针所指的内容变了。 常用到的两个输出重定向的符号">" 和 “>>” 第一个是清空重定向,会先清空...

PNUHC的博客 400

【Linux】实现一个minishell

完成一个minishell,其中可以实现简单的命令解释,以及重定向符号功能。 首先实现命令解释的思路: 获取用户输入内容 解析获取到的内容,得到命令及其参数 创建子进程 程序替换 shell中处理外部命令是通过创建子进程后程序替换完成功能,还有一部分命令是内建命令,也就是shell自身实现的功能,比如cd。 重定向实现思路: 解析字符串,重定向符号前是命令及参数,后面是文件名称 ...

swag_wg的博客 1028

【Linux】项目-minishell的实现

minishell的实现 实现原理   我们在这里手动实现一个小型的shell,可以用来处理我们一般常规的指令如ls,还可以附加参数-l,并且还可以进行重定向操作。   实现原理很简单,我们将用户输入的字符串读取到我们的缓冲区中,然后首先遍历一遍整个缓冲区看是否存在重定向符>或者>>,并且将重定向符改为\0并且读取出重定向的文件,随后保存判断结果。之后我们再次遍历一遍进行指令处理...

qq_41669298的博客 632

【Linux】文件重定向与实现支持文件重定向的minishell

重定向与dup2及其应用

vpurple_的博客 499

Linux终端bash之minishell实现

Linux终端bash之minishell实现前言项目介绍功能介绍模块分析注册信号初始化读取命令解析命令执行命令遇到的问题项目预览程序源码 前言   在一位大佬的博客看到的这个项目,感觉大佬写的这个项目功能较少,有可完善之处,本着完善的理念写了这个项目。 项目介绍   minishell是一个命令处理器,以程序的方式运行在终端中,接受终端输入的命令并进行解析执行结果。 功能介绍   实现的功能包括...

weixin_43855330的博客 789

linux下实现简易shell(minishell)

简介   本文将详细介绍简易minishell的流程,minishell能实现的功能主要是shell的外部命令,也能实现文件的相关操作(对文件进行打开、关闭、读写)。   在这里有必要提一下 linux/Unix 命令一般分为内建命令和外部命令这两类,(内部命令:构建在shell内部;外部命令:指的是Linux系统中能够完成特定功能的脚本文件或二进制程序,每个外部命令对应了系统中的一个文件,是属...

Code_beeps的博客 1216

Linux--自定义minishell中实现重定向功能

minishell中实现重定向功能 捕捉键盘输入 --ls -a \0> test.txt 解析重定向(判断有无>符号) 将重定向符号之前的信息按照以前的命令处理方式进行处理 --[ls -a ]\0> test.txt 取出重定向的文件名称 解析输入(得到命令名称+参数) 创建子进程 在程序替换之前,进行标准输出重定向到指定的文件,open,dup2 在子进程中进行程序替换 在父进程中进行进程等待 ...

qq_46659987的博客 1865
上一篇: Linux里的fork,popen,system函数
下一篇: Linux之动态/静态库
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值