Linux C下进程操作实例

时间:2022-08-29 18:48:09
/*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);
        }
    }
}