[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);
}
}
}