操作系统实验一、命令解释程序
一、实验目的
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)命令前后有空格示为合法命令。
三、设计原理(或方案)及相关算法
首先检查从键盘获取的命令前后是否有空格,若有空格的话除去首尾部空格,然后再和内部命令相比较,若相同,则调用system()函数执行命令;若不同,则调用execl()函数执行外部命令。
四、结果分析
五、源程序
# include<stdio.h>
# include<string.h>
# include<stdlib.h>
# define true 1
# define false 0
//去除首部空格
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 str3[80]={0};
char tem[80];
char *cmd;
char *scwt[]={"dir","cop","era","disp","end"};
char *scwt2[]={"dir","cp","rm","echo","end"};
static int cmdnum=5;
int j;
while(true)
{
printf("请输入指令:");
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;
}
else
{
if(fork()==0){
execl("/bin/sh","sh","-c",tem,(char*)0);
//perror(cmd);
}
wait(0);
}
}
}
return 0;
}