linux实现一个简易的minishell

【LINUX】Minishell的简单实现 首先我们要知道shell是什么--------命令行解释器--捕捉用户的输入,执行对应的指令程序。 阅读详情

今天分享linux下实现一个简易的minishell程序:
我使用的xshell6写的程序,不知为什么就是看不惯centos6的黑框框,,,
通常连接xshell6后进入就是如下图所示:
在这里插入图片描述
用户可以输入一系列指令然后会将结果显示出来,如上图所示

所以要写一个简易shell需要遵循以下过程:
1.获取命令行
2.解析命令行
3.建立一个子进程(fork)
4.替换子进程(execvp)
5.父进程等待子进程退出(wait)

实现代码如下所示:
写一个Makefile文件(项目的自动化辅助构建工具,可以定义项目的整体的构建编译规则)
我编写的Makefile如下图所示:
在这里插入图片描述
vi minishell.c文件,你没创建的话系统会帮你创建一个,进入后写入如下代码

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7     while(1){
  8         printf("[lgl@localhost]$ ");
  9         fflush(stdout);       //刷新缓冲区,stdout标准输出,可以显示出来否则一直有个\n,无法进行输出
 10         char buf[1024] = {0};//字符数组,存放用户输入
 11         //%[^\n]:从缓冲区读取字符串遇到\n停下,%*c:从缓冲区取一个字符,scanf()成功则返回值为1,失败为0
 12         if(scanf("%[^\n]%*c",buf) != 1){
 13             getchar();       //把\n放到getchar()中
 14             continue;
 15         }
 16 
 17         char* argv[32]; //指针数组来存储每个有效字符串首地址
 18         int argc = 0;
 19         char* ptr = buf;  //创建一个指针指向buf字符数组
 20         while(*ptr!='\0'){ //只要没到输入的字符串末尾就继续往下走
 21             if(!isspace(*ptr)){ //isspace函数判断是否空格,是的话就返回真
 22                 argv[argc++] = ptr; //走到不是空格的地方就存下这个位置
 23                 //然后把这个字符走完,之后在末尾添上'\0'
 24                 while(*ptr!='\0' && !isspace(*ptr)){
 25                     ptr++;
 26                 }
 27             }
 28             *ptr = '\0';
 29             ptr++; //继续往后走判断
 30         }
 31         argv[argc] = NULL;  //走完整个字符串后就在末尾加上NULL
 32         if(strcmp(argv[0],"cd")==0){//判断是否是内建命令,是的话,就直接执行,否则改变路径
 33             chdir(argv[1]);
 34               continue;
 35         }
 36         int pid = fork();
 37         if(pid<0){ //创建子进程失败,则继续创建,因为用户还要输入指令
 38             printf("fork error!");
 39             continue;
 40         }
 41         else if(pid==0){//创建子进程来完成程序替换任务
 42             if(execvp(argv[0],argv)<0){//返回值<0则说明有错,否则就直接执行替换的程序
 43                 perror("");
 44             }
 45             exit(0);//如果有错那就退出
 46         }
 47         //等待子进程退出,否则子进程会成为僵尸进程
 48         wait(NULL);
 49     }
 50     return 0;
 51 }                                           

然后要运行minishell.c文件时只需先make一下,编译minishell.c文件生成一个可执行程序minishell,如下图所示:
在这里插入图片描述
然后./minishell就可以运行了,运行结果如下图所示:
在这里插入图片描述
可以执行基本的shell命令,然后还可以查看文件内容如下所示:
在这里插入图片描述
在这里插入图片描述
小结:
这个程序就是综合了进程创建,进程控制,程序替换这几大块的知识来完成的。
所以一定要先理解清楚进程的概念,这几大块的知识还是相当重要的。

LINUX系统下自创minishell 1.获取终端用户输入的命令,并输出相应的执行结果2.使用多文件方式实现,使用Makefile管理。 阅读详情

相关推荐

基于Linux的MiniShell设计与实现

基于Linux的MiniShell设计与实现,含有小型的用于期末考试的文档,以及对应的源代码

Linux minishell的简单实现

minishell

qq_50119037的博客 1223

minishell.c

简单的迷你shell程序,通过这个代码可以简单的看到操作系统中,尤其是linux的shell迷你运行结果,当然你可以扩张~

Linux(五)创建一个miniShell

实现一个minishell

曾几何时的博客 1515

Mini-Shell:用C语言创建功能性迷你外壳

迷你壳 用C语言创建一个功能性迷你外壳。 特征 继承环境变量。 设置和删除环境变量。 在执行之前替换环境变量

minishell:minishell

minishell:minishell

Minishell:一款轻量级的开源Shell项目

Minishell:一款轻量级的开源Shell项目 Minishell 是一款轻量级的开源 Shell 项目,使用 C 语言进行开发。该项目旨在提供一个最小可行的 Shell 版本,帮助开发者深入理解使用 C 语言进行进程创建和同步的原理。 项目基础介绍 Minishell 是 42 学校 Unix 分支下的第二个项目。该项目遵循严格的编码规范(The Norme),并且在功能实现上仅使用了标准的...

gitblog_00658的博客 560

MINIshell学习资源

小型的linux的shell编写,适合于初学者学习用的一些相关资料

[linux]完成一个简易minishell

linux minishell 实现

qq_55961609的博客 479

微信开放标签wx-open-launch-app样式失效?手把手教你正确设置点击区域(附完整代码)

本文详细解析了微信开放标签`wx-open-launch-app`样式失效和点击无响应的常见问题,提供了完整的解决方案和代码示例。通过分析标签内部实现机制,指导开发者正确设置点击区域和样式,确保跨平台兼容性和用户体验优化。

joy55的博客 320

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

【Linux】实现一个minishell

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

swag_wg的博客 1028

Docker容器化部署Ceph集群:从零搭建高可用分布式存储

本文详细介绍了如何使用Docker容器化部署Ceph集群,从零搭建高可用分布式存储系统。通过环境一致性、快速扩容和资源隔离等优势,Docker显著提升了Ceph集群的部署效率和运维便捷性。文章涵盖硬件规划、镜像选择、单节点部署、多节点扩展及性能调优等实战内容,帮助开发者快速掌握分布式存储系统的容器化部署技巧。

weixin_29081101的博客 422

[Linux] 自己实现一个minishell

/* * minishell的实现 */ #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> #include <wait.h> #include <string.h> ...

giturtle's blog 341

浅析图像处理中的名词:Gamma 校正(Gamma变换、Gamma调整)

浅析图像处理中的名词:Gamma 校正(Gamma变换、Gamma调整)

qq_51908382的博客 1万+

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1886

Linux【实现一个简单的minishell】

深入了解shell原理,实现一个简单的minishell

undefined的博客 1171

Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。 StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

私房菜 2629

Linux下的程序替换, exec函数族,以及利用程序替换实现一个简单的minishell

程序替换 程序替换是指替换一个正在运行中的程序. 我们知道, linux中进程就是一个pcb, 是对一个运行中程序的描述, 通过虚拟地址空间及页表, 将程序运行对应的数据及代码映射到物理内存, 程序替换就是pcb不变, 但是映射到物理内存的代码和数据改变成另一个程序. 那么, 如何去理解程序替换呢? 我们可以这样去思考, 当我们使用 fork()创建子进程之后, 子进程执行的是和父进程相同的程序(先不考虑根据返回值进行代码分流), 这个时候, 我们就可以在子进程当中调用exec函数来执行其他的程序, 如果这

persistence_Y的博客 431

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Linux】模拟实现一个简单的minishell

简单实现一个minishell

vpurple_的博客 484

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux:实现一个简单的miniShell(进程程序替换实战)

目录1. miniShell2. 代码实现3. 代码运行结果 1. miniShell 我们本次要实现的是一个命令行解释器,就是Linux中在终端上输入相应的命令程序,然后输出相应的内容一样,类似: 它的本质是当你输入一个命令,然后Bash会创建一个子进程,然后对子进程进行进程程序替换,那么该子进程就会运行你刚刚输入的命令,然后一直循环。 如图: 总结一下,实现一个miniShell大概需要5步。 创建子进程 获取命令行 解析命令行 在子进程中进行进程程序替换 父进程等待子进程退出(wai

zw的博客 535

IEM模型,地表粗糙度模拟

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

linux中一个minishell终端的功能实现及延伸思考——多进程

在阅读《程序员的自我修养》一书中,关于可执行文件的装载一节中有一个实现minishell脚本的一段代码,大致功能是在该程序中输入需要加载的应用的名称,回车后可以得到对应的应用,有点类似一个shell终端,下面是我自己编程测试以及在这个过程中关于多进程的一些测试: 情况一: #include <stdio.h> #include <unistd.h> #include ...

jeremiah的博客 338

Linux项目实践(Minishell)

3.makefile维护文件时间戳,需要编译的重新编译,不需要重新的编译则省略编译的时间。9.cat 实现。1.ls 实现。ln -s file.txt a.txt 实现。3.rm 实现。2.touch 实现。3.minishell记录了用户输入命令的时间和内容,可以支持用户。

qq_43344188的博客 1656

Linux 软件编程学习之minishell小项目

Linux 软件编程小练习

mxyzhy的博客 1211
上一篇: 数据结构之无头单向非循环链表
下一篇: Linux之进程控制
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值