linux环境下使用c语言实现shell(一)

来源:互联网 发布:万网域名注册流程图 编辑:程序博客网 时间:2024/05/17 21:51

操作系统上机作业.
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);    }    return 0;}

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*/    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;    return 0;}

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]);        }        return 1;    }    if(strcmp(argv[0],"pwd")==0){        char buf[MAX_DIR_NAME];        printf("%s\n",getcwd(buf,sizeof(buf)));        return 1;    }    return 0;//not a buildin_command}

最后实现的结果:

这里写图片描述

这只是操作系统的一次上机作业,之后应该还要继续补充…功能在完善…

———————————–2017.4.22

0 0
原创粉丝点击