先解释一下Shell : Shell是一个功能为命令行解释器的应用程序,连接了用户和Linux内核,让我们能高效和安全地使用Linux内核。

       要写一个minishell,我们要先理解它的过程:

       读取输入->>命令解析->>创建子进程->>(子进程)程序替换->>(父进程)进程等待

      

      代码及注释如下:

 //minishell:
//命令行解释器:
//从标准输入读取数据(scanf) ls -l -a
//ls----运行ls命令----ls命令是一个外部程序
//创建一个进程,让这个进程运行ls程序(程序替换)
//读取输入->>命令解析->>创建子进程->>程序替换->>(父进程)进程等待
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<ctype.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>
#include<sys/wait.h> void Minishell()
{
//循环执行
while(){ //启动格式
printf("minishell:");
fflush(stdout);
char str[]={}; //1.读取输入 ls -a
//需要解决的问题: 空格不截断输入
//scanf返回值:成功:赋值数量,失败:EOF
// %[^\n]---^代表非 []代表字符集,接收所有在\n之前的任意字符
// %*c---*表示不读入(直接取出缓冲区的下一个字符),%*c的作用是为了丢掉\n
if(scanf("%[^\n]%*c",str)!=)
{
getchar(); //接收失败,吸收返回的EOF
}
// printf("cmd:[%s]\n",str); //2.解析命令
//需要解决的问题:命令分割,存储位置
//空格分割命令,模拟命令行参数存储命令
char* p = str;
char* argv[] = {NULL};
int argc = ;
while(*p!='\0')
{
if(*p!=)
{
//存入一个命令
argv[argc]=p;
argc++;
//走到空格
while(*p != && *p!='\0')
{
p++;
}
continue;
}
//遇到空格,分割,加结束标志
else
{
*p='\0';
p++;
}
}
//查看解析
/*int i=0;
for(i;i<argc;i++)
{
printf("argv[%d]--%s\n",i,argv[i]);
}
*/ //3.创建子进程
int pid=fork();
if(pid<)
{
perror("pid error");
exit(-);
}
//4.程序替换
else if(pid==)
{
//功能 : 重定向 -- 使用dup2改变数据流向
int i;
for(i=;i<argc;i++)
{
//> 将原本要写入到终端显示的数据,写入到指定的文件中,并清空文件原有内容
if(strcmp(argv[i],">")==)
{
close();
//打开该文件
int fd = open(argv[argc-],O_CREAT | O_TRUNC | O_RDWR,);
if(fd<)
{
perror("open error\n");
return;
} dup2(fd,);
//直接写入数据
int len;
for(len=;len<i;++len)
{
printf("%s ",argv[len]);
}
printf("\n"); close(fd);
return;
}
//>> 将原本要写入到终端显示的数据,追加写入到指定的文件中
if(strcmp(argv[i],">>")==)
{
close();
//打开文件
int fd = open(argv[argc-],O_CREAT | O_APPEND | O_RDWR,);
if(fd<)
{
perror("open error\n");
return;
}
dup2(fd,);
//直接写入数据
int len;
for(len=;len<i;len++)
{
printf("%s ",argv[len]);
}
printf("\n");
close(fd);
return;
}
}
//非重定向直接程序替换
execvp(argv[],argv);
exit(-);
}
//5.父进程等待子进程退出
waitpid(pid,NULL,); }
} int main()
{
Minishell();
return ;
}

       运行结果展示 :

          

      

      

手把手带你写一个minishell的更多相关文章

  1. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  2. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  3. 手把手带你画一个动态错误提示 Android自定义view

    嗯..再差1篇就可以获得持之以恒徽章了,今天带大家画一个比较简单的view. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/504771 ...

  4. 手把手用Monkey写一个压测脚本

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...

  5. 手把手教你写一个java的orm(五)

    生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...

  6. 手把手教你写一个java的orm(一)

    写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...

  7. 手把手教你写一个RPC

    1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...

  8. 让我手把手教你写一个强大、方便使用的 IOC 容器

    一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...

  9. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

随机推荐

  1. div+css制作哆啦A梦

    纯CSS代码加上 制作动画版哆啦A梦(机器猫) 哆啦A梦(机器猫)我们大家一定都很熟悉,今天给大家演示怎么用纯CSS.代码,来做一个动画版的哆啦A梦. 效果图: 下面代码同学可以查看一下,每个线条及椭 ...

  2. gj的zabbix客户端开机自启动设置

    查看是否自启动 配置chkconfig 启动服务

  3. Postgresql 时间串转换格式

    1. 时间:02-AUG-18 17:01:34 转成正常 年月日 时分秒 select to_char(to_timestamp('02-AUG-18 17:01:34', 'dd-mon-yy,h ...

  4. 用Xpath选择器解析网页(lxml)

    在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...

  5. vscode 添加eslint插件

    1. 安装vscode中的eslint插件 Ctrl + Shift + P 调出控制台,输入install,再在插件版块查找ESLint,安装 2. 安装node,安装npm 3. 全局安装ESLi ...

  6. pycharm+gitee环境搭建(超详细)

    背景:本地开发代码在没有云托管的时候代码很容易丢掉,如果是小团队,这时候可以使用公司团队注册一个账号共同使用.如果是个人用于代码存储或者用于以后项目经验也推荐gitee.大的团队可以购买 环境:win ...

  7. 行业大秀:EasyEarth Show!

    EasyEarth三维可视化地理信息云平台是由北京四维益友信息技术有限公司自主研发的新一代面向三维可视化应用领域的基础信息系统平台. EasyEarth以数据管理为核心,围绕7大类基础数据,提供综合管 ...

  8. 20189220 余超《Linux内核原理与分析》第一周作业

    实验一 Linux系统简介 通过实验一主要是学习到了Linux 的历史简介,linux与windows之间的区别,主要是免费和收费,软件和支持,安全性,使用习惯,可制定性,应用范畴等.linux具有稳 ...

  9. SOAP简介及实例

    SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换. 或者更简单地说:SOAP 是用于访问网络服务的协议. 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本 ...

  10. 更新Alpine Linux源 sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories apk add xxx

    更新Alpine Linux源 国内镜像源 清华TUNA镜像源:https://mirror.tuna.tsinghua.edu.cn/alpine/中科大镜像源:http://mirrors.ust ...