分析linux的shell程序,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;iprintf("%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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>