Linux系統的命令分為內部命令和外部命令兩種,內部命令由Shell程序實現,如cd、echo等,Linux的內部命令數量有限,而且絕大部分都很少用到。而每一個Linux外部命令都是一個單獨的應用程序,我們非常熟悉的ls、cp等絕大多數命令都是外部命令,這些命令都以可執行文件的形式存在,絕大部分放在目錄/bin和/sbin中。這樣一來,我們編程的難度就可以大大下降了,我們只需要實現很有限的內部命令,對於其它的輸入,統統當作應用程序來執行即可。//MyShell.c#include#include #include #include #include #define MAXSIZE 100 void info_print(); int main(int argc, char const *argv[]) { /* code */ while(1){ char command[MAXSIZE]; pid_t pid; int status; info_print(); bzero(command,MAXSIZE); gets(command); if(-1==(pid=fork())){ perror(fork); exit(-1); } if(pid>0){ wait(&status); }else{ int i,flag=0,j=0; char *file,*argv[10]; file=command; argv[flag++]=command; for(i=0;command[i]!='';i++){ while(command[i]==' '){ command[i++]=''; j=1; } if(1==j){ argv[flag++]=command+i; j=0; } } argv[flag]=NULL; if(0==strncmp(file,cd,2)){ //printf(OK%s ,argv[1]); if(-1==chdir(argv[1])){ perror(chdir); exit(-1); } }else{ if(-1==execvp(file,argv)){ //perror(execvp); fprintf(stderr,%s: command not found ,file); } } } } return 0; } void info_print() //打印提示信息 { char buf[MAXSIZE],*username,hostname[MAXSIZE],pwd[MAXSIZE],ch; bzero(buf,MAXSIZE); bzero(pwd,MAXSIZE); bzero(hostname,MAXSIZE); if(NULL==(username=getenv(USER))){ printf(Error: get username failure! ); exit(-1); } if(NULL==getcwd(pwd,MAXSIZE)){ perror(getcwd); exit(-1); } if(-1==gethostname(hostname,MAXSIZE)){ perror(gethostname); exit(-1); } if(0==strcmp(username,root)){ ch='#'; }else{ ch='$'; } sprintf(buf,%s@%s:%s%c ,username,hostname,pwd,ch); fprintf(stdout,%s,buf); }