Linux:minishell
目录
1.实现逻辑
2.代码及效果展示
1.打印字符串提示用户输入指令
2.父进程拆解指令
3.子进程执行指令,父进程等待结果
4.效果
3.实现过程中遇到的问题
1.打印字符串的时候不显示
2.多换了一行
3.cd路径无效
4.优化
1.ll指令
2.给文件或目录加上颜色
代码链接
模拟实现shell程序
所用知识
1.基础的C语言知识,fgets,fflush(刷新缓冲区)
2.字符串相关的函数:strtok
3.进程的创建(fork)进程的等待(waitpid) 进程的替换(exec*函数) 进程的终止(exit)
shell运行原理
父进程等待&&解析指令,子进程执行指令
1.实现逻辑
shell需要一直等待用户输入指令,然后执行指令,因此写一个死循环
1.打印出字符串"[zy@localhost myshell]# "提示用户输入信息
--使用fflush刷新缓冲区
2.父进程分析指令
--定义一个字符数组cmd来存放完整的指令(使用fgets函数,将命令读取到字符数组cmd中)
--定义一个字符指针数组来存放拆解后的指令(使用strtok函数,将其拆解)
--创建子进程执行指令,然后阻塞等待执行的结果
3.子进程执行指令
--调用execvp函数,执行拆解好的指令
2.代码及效果展示
--预备工作
--定义一个字符数组cmd来存放完整的指令(使用fgets函数,将命令读取到字符数组cmd中)
--定义一个字符指针数组来存放拆解后的指令(使用strtok函数,将其拆解)
--定义一个分割符(使用#define定义SEP为空格)
1.打印字符串提示用户输入指令
19 //1.打印字符串,提示用户输入指令 20 printf("[zy@localhost myshell]# "); 21 fflush(stdout); 22 memset(cmd,'\0',sizeof(cmd));//初始化 23 24 if(fgets(cmd,sizeof(cmd),stdin)==NULL) continue;//读取用户输入的指令,若输入为NULL直接跳过 25 cmd[strlen(cmd)-1] = '\0';//由于是从键盘读取,会读取到\n,我们将其置为\0
--fflush是用来刷新缓冲区的
--memset将cmd数组初始化,也清除了上一次输入的指令
--fgets函数:参数:char *str,int num ,FILE* stream
1.存储从输入流中读取的字符串 2.读取的最大字符数 3.从那读
2.父进程拆解指令
代码:
27 //2.拆解指令,放进g_argv中,后面调用execvp的时候直接传递 28 int index = 0; 29 g_argv[index++] = strtok(cmd,SEP); 30 while(g_argv[index++]=strtok(NULL,SEP));
--strtok:参数:char* str , const char *strDelimit (要分割的字符串,用来分割的字符)
第一次调用后,下一次还要继续分割这个字符,传递NULL即可,它会记录分割点的位置
3.子进程执行指令,父进程等待结果
4.效果
3.实现过程中遇到的问题
1.打印字符串的时候不显示
字符串不显示
使用fflush,刷新缓冲区即可
效果:
2.多换了一行
代码:
这里可以看到多换了一行
原因:fgets从键盘读取数据会把\n也读进cmd中,我们需要把\n置为'\0'
方法:cmd[strlen(cmd)-1] = '\0'; strlen遇到\0就不在计数了,通过其找到'\n'的位置
效果:
3.cd路径无效
原因:
1.子进程是父进程的一份拷贝,直接用pwd显示的路径就是父进程的路径
2.如果使用cd指令,exec函数执行完就退出了,再执行pwd就是重新调用,父进程会生成一个新的子进程, 显示的是父进程的路径
解决:加一个判断,如果是cd命令,直接使用chdir改变当前父进程的路径
33 if(strcmp(g_argv[0],"cd")==0)//特殊处理一下cd指令34 {35 if(g_argv[1]!=NULL) chdir(g_argv[1]); 36 continue;37 }
解决:
4.优化
1.ll指令
解决:特殊处理一下
32 if(strcmp(g_argv[0],"ll")==0)//特殊处理一下ll指令33 {34 g_argv[0] = (char*)"ls";35 g_argv[index++] = (char*)"-l"; 36 }
原来:
解决:
2.给文件或目录加上颜色
思路:特殊处理
这是ls加上颜色的指令:
代码:
32 if(strcmp(g_argv[0],"ls")==0)//特殊处理ls指令,为其加上颜色33 {34 g_argv[index++] = (char*)"--color=auto";35 }36 37 if(strcmp(g_argv[0],"ll")==0)//特殊处理ll指令38 {39 g_argv[0] = (char*)"ls";40 g_argv[index++] = (char*)"--color=auto";41 g_argv[index++] = (char*)"-l";
效果:
代码链接
链接:myshell · 朱垚/C++与Linux实例 - 码云 - 开源中国 (gitee.com)
相关文章:
Linux:minishell
目录 1.实现逻辑 2.代码及效果展示 1.打印字符串提示用户输入指令 2.父进程拆解指令 3.子进程执行指令,父进程等待结果 4.效果 3.实现过程中遇到的问题 1.打印字符串的时候不显示 2.多换了一行 3.cd路径无效 4.优化 1.ll指令 2.给文件或目录加上颜色 代码链接 模…...
STM32驱动步进电机
前言 (1)本章介绍用stm32驱动42步进电机,将介绍需要准备的硬件器材、所需芯片资源以及怎么编程及源代码等等。 (2)实验效果:按下按键,步进电机顺时针或逆时针旋转90度。 (3ÿ…...
计算机视觉——飞桨深度学习实战-深度学习网络模型
深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分,本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍,从经典的深度学习网络模型以CNN、RNN为代表,到为了解决显存不足、实时性不够等问题的轻量化网络…...
用c动态数组(不用c++vector)实现手撸神经网咯230901
用c语言动态数组(不用c++的vector)实现:输入数据inputs = { {1, 1}, {0,0},{1, 0},{0,1} };目标数据targets={0,0,1,1}; 测试数据 inputs22 = { {1, 0}, {1,1},{0,1} }; 构建神经网络,例如:NeuralNetwork nn({ 2, 4,3,1 }); 则网络有四层、输入层2个nodes、输出层1个节点、第…...
视频讲解|基于DistFlow潮流的配电网故障重构代码
目录 1 主要内容 2 视频链接 1 主要内容 该视频为基于DistFlow潮流的配电网故障重构代码讲解内容,对应的资源下载链接为基于DistFlow潮流的配电网故障重构(输入任意线路),对该程序进行了详尽的讲解,基本做到句句分析和讲解(讲解…...
Ultralytics(YoloV8)开发环境配置,训练,模型转换,部署全流程测试记录
关键词:windows docker tensorRT Ultralytics YoloV8 配置开发环境的方法: 1.Windows的虚拟机上配置: Python3.10 使用Ultralytics 可以得到pt onnx,但无法转为engine,找不到GPU,手动转也不行࿰…...
springboot之@ImportResource:导入Spring配置文件~
ImportResource的作用是允许在Spring配置文件中导入其他的配置文件。通过使用ImportResource注解,可以将其他配置文件中定义的Bean定义导入到当前的配置文件中,从而实现配置文件的模块化和复用。这样可以方便地将不同的配置文件进行组合,提高…...
阿里云服务器免费申请入口_注册阿里云免费领4台服务器
注册阿里云账号,免费领云服务器,最高领取4台云服务器,每月750小时,3个月免费试用时长,可快速搭建网站/小程序,部署开发环境,开发多种企业应用。阿里云百科分享阿里云服务器免费领取入口、免费云…...
ES6中的async、await函数
async是为了解决异步操作,其实是一个语法糖,使代码书写更加简洁。 1. async介绍 async放在一个函数的前面,await则放在异步操作前面。async代表这个函数中有异步操作需要等待结果,在一个async函数中可以存在多个await࿰…...
代码随想录算法训练营第五十六天 | 动态规划 part 14 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和(dp)
目录 1143.最长公共子序列思路代码 1035.不相交的线思路代码 53. 最大子序和(dp)思路代码 1143.最长公共子序列 Leetcode 思路 本题和718. 最长重复子数组 区别在于这里不要求是连续的了,但要有相对顺序,即:“ace” …...
【数据挖掘】2021年 Quiz 1-3 整理 带答案
目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1 (30%). Consider the training data shown below. Here, A A A and B B B</...
【软件设计师-中级——刷题记录6(纯干货)】
目录 管道——过滤器软件体系结构风格优点:计算机英语重点词汇:单元测试主要检查模块的以下5个特征:数据库之并发控制中的事务:并发产生的问题解决方案:封锁协议原型化开发方法: 每日一言:持续更新中... 个…...
微信小程序点单左右联动的效果实现
微信小程序点单左右联动的效果实现 原理解析: 点击左边标签会跳到右边相应位置:点击改变rightCur值,转跳相应位置滑动右边,左边标签会跳到相应的位置:监听并且设置每个右边元素的top和bottom,再判断当…...
Socket通信
优质博文IT-BLOG-CN 一、简介 Socket套接字:描述了计算机的IP地址和端口,运行在计算机中的程序之间采用socket进行数据通信。通信的两端都有socket,它是一个通道,数据在两个socket之间进行传输。socket把复杂的TCP/IP协议族隐藏在…...
TCP 如何保证有效传输及拥塞控制
TCP(传输控制协议)可以通过以下机制保证有效传输和拥塞控制: 确认机制:TCP使用确认机制来保证数据的有效传输。发送方在发送数据的同时还会发送一个确认请求,接收方收到数据后会回复确认响应。如果发送方没有收到确认响…...
PyQt5+Qt设计师初探
在上一篇文章中我们搭建好了PyQt5的开发环境,打铁到趁热我们基于搭建好的环境来简单实战一把 一:PyQt5包模块简介 PyQt5包括的主要模块如下。 QtCore模块——涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及的时间、文件、目录、数…...
rust cargo
一、cargo是什么 Cargo是Rust的构建工具和包管理器。 Cargo除了创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。 真正编写程序时,我们不直接用rustc,而是用cargo。 二、使用cargo (一)使用…...
CANoe.Diva生成测试用例
Diva目录 一、CANoe.Diva打开CDD文件二、导入CDD文件三、ECU Information四、时间参数设置五、选择是否测试功能寻址六、勾选需要测试服务项七、生成测试用例 一、CANoe.Diva打开CDD文件 CANoe.Diva可以通过导入cdd或odx文件,自动生成全面的测试用例。再在CANoe中导…...
openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译
文章目录 openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译89.1 查询编译:PREPARE语句89.2 运行命令89.3 轻量执行支持的查询89.4 轻量执行不支持的查询89.5 JIT存储过程89.6 MOT JIT诊断89.6.1 mot_jit_detai…...
python获取时间戳
使用 datetime 库获取时间。 获取当前时间: import datetime print(datetime.datetime.now()) . 后面的是微秒,也是一个时间单位,1秒1000000微秒。 转为时间戳: import datetimedate datetime.datetime.now() timestamp date…...
2023年山东省安全员C证证考试题库及山东省安全员C证试题解析
题库来源:安全生产模拟考试一点通公众号小程序 2023年山东省安全员C证证考试题库及山东省安全员C证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…...
Java中的Unicode字符编码与占用比特位解析
本文将详细介绍Java中Unicode字符编码与占用比特位的相关知识。我们将首先介绍Unicode字符集的基本概念,然后深入探讨Java中Unicode字符的编码方式以及占用比特位的特点。最后,我们将讨论一些特殊字符的编码情况,并给出一些在Java中处理Unico…...
分布式事务-TCC案例分析流程图
防止cancel方法在最后执行出现问题,用户收到提示已经退款成功但是由于cancel过慢或者出现问题(虽然最后会重试成功但是用户体验很差),可以做以下的业务sql模型优化(增加一个冻结金额)。...
究竟是什么样的讲解数组算法的博客让我写了三小时???
版本说明 当前版本号[20231004]。 版本修改说明20231004初版 目录 文章目录 版本说明目录二. 基础数据结构2.1 数组1) 概述2) 动态数组1)插入addlast 方法测试: addlast 方法 add 方法测试:add方法 addlast 方法与 add 方法合并版get 方法测试&#x…...
Day-05 CentOS7.5 安装docker
参考 : Install Docker Engine on CentOS | Docker DocsLearn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/install/centos/ Doc…...
Makefile
目录 Makefile Makefile格式 Makefile函数:foreach和wildcard $(foreach var,list,text) $(wildcard pattern) 完善Makefile Makefile 在Linux中使用make工具来编译程序(特别是大程序),而make工具所执行的动作依赖于Makefil…...
c语言练习77:公因⼦的数⽬
公因⼦的数⽬ 题⽬描述: 给你两个正整数 a 和 b ,返回 a 和 b 的公因⼦的数⽬。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的⼀个公因⼦ 。 • ⽰例 1: 输⼊:a 12, b 6 输出:4 解释&#…...
【C++】C++11——右值引用和移动语义、左值引用和右值引用、右值引用使用场景和意义、完美转发、新的类功能
文章目录 C115.右值引用和移动语义5.1左值引用和右值引用5.2左值引用与右值引用比较5.3右值引用使用场景和意义5.4右值引用引用左值及其一些更深入的使用场景分析5.5完美转发 6.新的类功能 C11 5.右值引用和移动语义 右值引用是C11引入的一个新特性,用于支持移动语义…...
Spring Boot的创建和使用(JavaEE进阶系列2)
目录 前言: 1.什么是Spring Boot?为什么要学习Spring Boot? 2.Spring Boot优点 3.创建Spring Boot项目 3.1准备工作 3.2Spring Boot创建 3.2.1通过idea的方式创建 3.2.2通过网页创建 4.Spring Boot中的配置文件 4.1Spring Boot配置…...
【OLSR路由协议】链路状态路由(OLSR)协议中选择多点中继节点算法研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
制作网站的手机软件/班级优化大师怎么加入班级
思想:自己造杨辉三角 代码: import java.util.Scanner;public class Main {public static void main(String[] args) {//创建数组,大小自己设定,可以写一个测试函数,测试当前大小的数组的最大值是否大于1000000000lo…...
自己做网站用买域名吗/吉林网络推广公司
每天利用计划任务在凌晨1点自动执行,备份zabbix的数据库至本地的/backup/mysql_backup目录 #!/bin/sh DUMP/usr/bin/mysqldump OUT_DIR/backup/mysql_backup LINUX_USERroot DB_NAMEzabbix DB_USERroot DB_PASS123456 cd $OUT_DIR DATEdate %Y%m%d OUT_SQL"$DA…...
深圳注明企业网站设计/百度网盘搜索引擎入口在哪
用不了两个星期,就会在大多数的LINUX版本中的主要应用程序中发现安全漏洞,从而允许本地用户立即成为root,不管这些软件有多高的质量,确保安全问题是一项艰巨的任务,它必须禁止恶意用户从系统资源中非法获得利益。提供程…...
厦门网站关键词优化/保定seo推广公司
什么是spring Spring是java企业级应用的开源开发框架。Spring主要用来开发java应用,但是有些扩展是针对于J2EE平台的web应用。其目的是为了简化java企业级应用开发。 使用Spring框架的好处是什么 轻量:基本的版本大约为2MB控制反转Ioc:spr…...
长沙做网站品牌/app推广是什么工作
FastReport .Net是一款强大且应用十分广泛的报表工具,我最喜欢的特点之一是它直接从用户应用程序中创建报表的能力。在这篇文章中,我们来看看这个功能的例子,当你不需要一堆的.exe文件的时候它就能派上用场了。此外,你可以根据应用…...
哪个网站做图片外链/青岛seo整站优化
作者:TerryLee 来源:博客园 时间:2008-09-19 阅读:3357 次 原文链接 [收藏] 摘要:微软在.NET 3.5中推出了LINQ,现在各种LINQ Provider满天飞,TerryLee在老外站点上收集了一份LINQ Provi…...