Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180823
  • 博文数量: 80
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 835
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-29 10:30
文章分类
文章存档

2009年(12)

2008年(60)

2007年(8)

我的朋友

分类: LINUX

2008-01-15 12:31:31

Linux 命令解释程序的实现(shell)

操作系统的实验,实现简单的命令解析和系统调用。

实验内容:

(1)parse应提供一个命令提示符,如parse>,表示接收用户的输入,每次执行完成后再打印下一个命令提示符parse>。当用户没有输入时,parse需要一直处于随时等待输入状态,同时再屏幕上显示一些必要的信息。

(2)如果用户提交了一个内部命令,parse应当按照下面的描述执行相应动作。
 quit:结束所有的子进程并退出parse.
 disp: 显示命令行后的所有字符。
 list:列出当前目录下的所有文件。
 changedir:改变当前目录到所输入目录。

(3)分析用户输入
    1)分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。如用户输入的某些地方出错了,parse应提供合理的出错信息。
    2)就像shell一样,parse每次接受用户输入的一行命令,在用户按下回车键(Enter)后开始执行分析动作。

#include
#include
char compare(char *);
void input(char arg[][20],int *);
int main() {
char arg[5][20];
int i,argc,exit;
exit=0;
while(exit==0) {
        input(arg,&argc);
        printf("the command is %s\n",arg[0]);
        switch(compare(arg[0])) {
                case 'q':{//quit
   exit=1;
                        break;
                }
                case 'd':{//disp
                for(i=1;i   printf("%s ",arg[i]);
  printf("\n");
                        break;
                }
                case 'l':{//list
   if(fork()==0)
                         execlp("ls","ls",NULL);
   
                        break;
                }
                case 'c':{//changedir
                        chdir(arg[1]);
   if(fork()==0)
                         execlp("pwd","pwd",NULL);
                        break;
                }
                case 'e':{
                        printf("enter error\n");
                        break;
                }
        }
 wait(NULL);
 }
}
char compare(char *str) {
        //printf("%s\n",str);
        if(strcmp(str,"quit")==0)return 'q';
        if(strcmp(str,"disp")==0)return 'd';
        if(strcmp(str,"list")==0)return 'l';
        if(strcmp(str,"changedir")==0)return 'c';
        else return 'e';
}
void input(char arg[][20],int *argc) {
char *cmd_s,*cmd_e,cmd[100];
int i=0,cmd_l=0;
        cmd_s=cmd_e=cmd;
        printf("weibing>");
        fgets(cmd,sizeof(cmd),stdin);
        for(i=0;*cmd_e!='\0'&&i<5;cmd_e++) {
                if(*cmd_e==' '||*cmd_e=='\n') {
                        strncpy(arg[i],cmd_s,cmd_l=cmd_e-cmd_s);
                        arg[i][cmd_l]='\0';
                        cmd_s=cmd_e+1;
                        i++;
                }
        }
        strcpy(arg[i],cmd_s);
        *argc=i+1;
}

阅读(1783) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~