[code]/*ex5-14.c*/ #include <sys/types.h> #include <unistd.h> #include <stdio.h> #define MAXARG 10 //每條命令所能使用的最大參數個數 #define LINSIZ 80 //每條命令的字符緩存數組 #define CMDSIZ 8 //一次提交的最多的命令個數 extern char **environ; char *quit="quit.quit"; char cmdbuf[CMDSIZ][LINSIZ]; //二維數組cmdbuf存放從標准輸入讀到的命令串 int cmdflag[CMDSIZ]; //數組cmdflag決定該命令以何種方式執行(0為前台,1為後台) int main() { int i; for( ; ;) //無限循環(用以接收用戶輸入的命令行) { printf("mini_SH-->"); for(i=7; i>=0; i--) { cmdflag[i]=0; cmdbuf[i][0]='\0'; } if(i=readcmd()) //readcmd作用是將用戶輸入的命令字符串譯碼到已定義的外部變量cmdbuf二維數組中 docommand(i); //執行存放在cmdbuf中的命令 else printf("read command failed, try again!!!\n"); } } readcmd() //將用戶從標准輸入提交的一行命令,按分號為界,分別存入命令緩沖區cmdbuf中 { char c, *p; int i=0; p=cmdbuf[0]; while((c=getchar())!='\n') { if(c==';') { *p='\0'; if(++i==6) return(++i); p=cmdbuf[i]; } else if(c=='&') { cmdflag[i]=1; } else *p++=c; } *p='\0'; //每次命令提交時,該數組字段被清為零 return(++i); //返回該次用戶提交的命令個數 } docommand(int i) { int j, stat, pid; char *argl[MAXARG], args[LINSIZ]; char c, *argsp, **arglp, *p; for(j=0; j<i; j++) { arglp=argl; argsp=args; p=cmdbuf[j]; while((c=*p++)!='\0') { while (c==' '||c=='\t') c=*p++; if(c=='\0') { *argsp++='\0'; break; } *arglp++=argsp; while(c!=' '&&c!='\t'&&c!='\0') { *argsp++=c; c=*p; if(c) p++; } *argsp++='\0'; } *arglp=(char *)0; if(strcmp(argl[0], quit)==0) { printf("Bye Bye!\n"); exit(0); } if((pid=fork())==0) { if(cmdflag[j]) setpgrp(); execve(argl[0], argl, environ); printf("Return from execve: %s\n", cmdbuf[i]); exit(10); } else { if(!cmdflag[j]) while(wait(&stat)!=pid); } } }