一、实验目的
1、探索、理解并掌握操作系统命令解释器的设计原理和实现机,基于 Linux 内核进行相应命令解释程序的设计和实现;
2、通过本实验掌握Linux 操作系统平台及GCC编译器的编译、调试方法;
3、掌握虚拟机平台的使用、管理。
二、实验内容
利用C语言编写一个微型命令解释程序minishell.c,该程序可接收并解释以下命令:
(1) dir 列出当前目录
(2) cop file1 file2 拷贝文件
(3) era filename 删除文件
(4) disp string 显示字符串
(5) end 结束,退出
要求:
(1)检查命令的合法性,如果有错误,显示出错信息,等待重新输入;
(2)命令前后有空格示为合法命令。
三、设计原理(或方案)及相关算法
流程图:
四、结果分析
从运行结果可以看出,当输入dir命令后,运行,它会显示当前目录下的所有文件,当输入的命令缺少操作数时,它会提示缺少操作数这样的信息,输入命令disp xx,就会显示xx,当想退出的时候,输入exit,它提示命令错误,必须要输入它已定义的命令。通过这次实验,我对命令行解释程序有了不少了解。
五、源程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//去除首部空格
void trim(char * cmd1,char * tem){
int m=0;
while (cmd1[m]==' ')
m++;
strncpy(tem,cmd1+m,strlen(cmd1)-m);
tem[strlen(cmd1)-m] = '\0';
}
int main(){
char cmd1[80];
char str2[80];
char tem[80];
char str3[80]={0};
char *cmd;
char *scwt[] = {"dir","cop" ,"era" ,"disp" ,"end"};
char *scwt2[] = { "dir","cp", "rm" ,"echo","end" };
static int cmdnum = 5;
int j;
while(1){
printf( "Please input command:",scwt);
gets(cmd1);
trim(cmd1,tem);
//找到第一个出现空格的位置
int n=strcspn(tem ," ");
if(n>0 || strlen(tem)>0){
strncpy(str2,tem,n);
str2[n]='\0';
cmd=str2;
for (j = 0; j < cmdnum; ++j) {
if (strcmp(cmd,scwt[j])==0){
break;
}
}
if (j==4)
exit(0);
if (j<cmdnum){
//拼接字符串
sprintf(str3,"%s%s",scwt2[j],tem+n);
system(str3);
continue;
}
printf("Bad command\n");
}
}
return 0;
}