简单实现minishell

阅读: 评论:0

简单实现minishell

简单实现minishell

简单实现minishell

什么是Shell?

​ 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command和后来的。它接收用户命令,然后调用相应的应用程序。

如何实现简单Shell?

1.从标准输入中读取数据
2.拆分可执行程序和命令行参数,我们认为从命令行输入的第一个空格之前的数据时可执行程序的名称,第一个空格之后的内容都是命令行参数
3.创建子进程,让子进程替换可执行层序
4.在子进程替换时间内让父进程等待

代码实现

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
//保存字符的ASC码值
#include <ctype.h>
#include <sys/wait.h>char g_command[1024];//全局字符数组保存输入的命令int GetConmand()//从命令行获取输入的命令
{//清空字符数组memset(g_command,'',sizeof(g_command));//-1是为了预留一个的位置防止数组越界if( fgets(g_command,sizeof(g_command)-1,stdin) == NULL){printf("fgets errorn");return -1;}return 0;
}int ExecCommand(char* argv[])
{if(argv[0] == NULL)//判断命令是否有效{printf("ExecCommand Pram errorn");return -1;}pid_t pid =fork();//创建子进程if(pid < 0){printf("create subprocess failedn");return-1;}else if (pid == 0){//子进程execvp(argv[0],argv);//进程替换//需要注意万一替换失败,一定要杀掉exit(0);}else{waitpid(pid,NULL,0);//父进程阻塞等待子进程运行结束}return 0;
}int DealCommand(char* commmand)
{//差错控制if(!commmand || *commmand == ''){printf("command errorn");return -1;}//拆分命令int argc = 0;char* argv[1024] = {0};while(*commmand)//循环到字符串结尾{while(!isspace(*commmand)&& *commmand != ''){argv[argc] = commmand;//将命令全部拷贝argc++;while(!isspace(*commmand)&& *commmand != '')//判断是否为空格或者命令结束commmand++;*commmand = '';//给字符数组加上字符串结束标志}commmand++;}argv[argc] = NULL;ExecCommand(argv);return 0;
}int main()
{while(1){printf("[test@localhost minishell]$ ");fflush(stdout);//从标准输入中读取命令if(GetConmand() == -1){continue;}//差分字符串,创建子进程,DealCommand(g_command);}return 0;
}

本文发布于:2024-01-29 01:12:00,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170646192511644.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:简单   minishell
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23