linux环境下使⽤c语⾔实现shell(⼀)
操作系统上机作业.
sh1.c: 实现shell程序,要求具备如下功能
–⽀持命令参数
$echo arg1 arg2 arg3
$ls /bin /usr/bin /home
–实现内置命令cd、pwd、exit
$cd /bin
$pwd
/bin
整体框架
⼀个死循环,⼀直在等待这⽤户输⼊命令.主要的⼯作都在eval这个函数⾥⾯.
int main(int argc,char *argv[]){
char cmdstring[MAX_CMD];
int n;
while(1){
printf("*myshell*>");
fflush(stdout);
/*read*/
if((n=read(0,cmdstring,MAX_CMD))<0){
printf("read error");
}
eval(cmdstring);
}
return0;
}
eval函数实现
unix中命令分为内置命令和外置命令,内置命令不需要开进程就可以直接执⾏,⽐如cd,pwd.外置命令需要重开个进程才能执⾏,⽐如
vim,/bin/ls,/bin/echo.
eval函数中有两个外调函数就是parseline,解析命令⾏cmdstring,储存到argv数组中.bulidin_command函数判断命令是否是内置命令,如果是,则执⾏.不是则返回false.
void eval(char *cmdstring){
/*parse the cmdstring to argv*/
char *argv[MAX_CMD];
/*Holds modified command line*/
char buf[MAX_CMD];
strcpy(buf,cmdstring);
/*parse the cmdstring*/
shell命令属于什么语言parseline(buf,argv);
if(argv[0]==NULL){
return;/*ignore empty lines*/
}
/*is a buildin command*/
/*direct return*/
if(buildin_command(argv)) return;
int pid = fork();
if(pid == 0){
if(execvp(argv[0],argv)<0){
printf("%s:command not found.\n",argv[0]);
exit(0);
}
}
wait(pid);
}
其中关于exec系列函数的讲解请参照.
parseline函数实现
就是⼀个字符串操作,根据空格分割,写的⽐较屎.读者可以⾃⼰实现,不需要模仿我的.记得最后的argv数组要以NULL结尾.
int parseline(char *buf,char**argv){
while(*buf==' '){
buf++;
}
int delim = 0;
int argc = 0;
while(*buf!='\n'){
while(buf[delim]!='\n'&&buf[delim]!=' '){
delim++;
}
if(buf[delim] == '\n'){
buf[delim] = '\0';
argv[argc++] = buf;
break;
}
buf[delim] = '\0';
argv[argc++] = buf;
buf+=delim+1;
/*指⽰器indicator=0*/
delim = 0;
while(*buf==' '){
buf++;
}
}
/*the last element is NULL*/
argv[argc] = NULL;
return0;
}
buildin_command函数实现
题⽬要求的⼏个内置命令,也就实现了这⼏个内置命令.关于getcwd和chdir的使⽤可以⾃⾏百度.
int buildin_command(char **argv){
if(strcmp(argv[0],"exit")==0){
exit(0);
}
if(strcmp(argv[0],"cd")==0){
if(chdir(argv[1])){
printf("myselous:cd:%s:no such directory\n",argv[1]);
}
return1;
}
if(strcmp(argv[0],"pwd")==0){
char buf[MAX_DIR_NAME];
printf("%s\n",getcwd(buf,sizeof(buf)));
return1;
}
return0;//not a buildin_command
}
最后实现的结果:
这只是操作系统的⼀次上机作业,之后应该还要继续补充…功能在完善…———————————–2017.4.22
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论