Linux Cでのプロセス操作の例

5970 ワード

/*ex5-14.c*/
#include 
#include 
#include 

#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!!!
"
); } } readcmd() // , , cmdbuf { char c, *p; int i=0; p=cmdbuf[0]; while((c=getchar())!='
'
) { 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; jwhile((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!
"
); exit(0); } if((pid=fork())==0) { if(cmdflag[j]) setpgrp(); execve(argl[0], argl, environ); printf("Return from execve: %s
"
, cmdbuf[i]); exit(10); } else { if(!cmdflag[j]) while(wait(&stat)!=pid); } } }