【进程控制下】实现一个简易的shell

1.shell原理
运用程序替换的原理来实现的,shell自己就是一个进程。

1.获取命令行
2.解析命令行
3.创建子进程(fork)
4.替换子进程(exec5.父进程等待子进程退出(wait)

2.shell

#include <unistd.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

char *argv[8]; 
int argc = 0;

void do_parse(char *buf)  //解析
{
    int i;
    int status = 0;
    for (argc=i=0; buf[i]; i++ ) 
    {
        if ( !isspace(buf[i]) &&status == 0 )
        { 
            argv[argc++] = buf+i;  //将输入的命令存入数组
            status = 1;
        } else if ( isspace(buf[i]) ) 
        { 
            status = 0;
            buf[i] = 0;
        }
    }   
    argv[argc] = NULL;
}

void do_execute( void )  //替换
{
    pid_t pid = fork();
    switch( pid ) 
    { 
        case -1: 
        perror("fork");  //创建进程失败
        break;
        case 0:   //子进程
        execvp(argv[0], argv);  //替换子进程
        perror("execvp");
        exit(EXIT_FAILURE); 
        default:  //父进程
        {
            int st;
            while ( wait(&st) != pid )  //成功返回被等待进程pid,失败返回-1。
                ;   
        }
    }
}

int main( void )
{
    char buf[1024] = {}; 
    while ( 1 ){
    printf("myshell@host: "); 
    scanf("%[^\n]%*c", buf); 
    //%[^\n] 读入任意多的字符,直到遇到"\n"停止
    do_parse(buf); 
    do_execute();
    }
    return 0;
}

实现效果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/guorong520/article/details/79963294