歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux C下進程操作實例

Linux C下進程操作實例

日期:2017/3/3 12:47:35   编辑:Linux技術
[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);
        }
    }
}
Copyright © Linux教程網 All Rights Reserved