Linux下MiniShell的实现

Shell到底是什么?
1.shell的含义:
shell这个单词的英文含义为“壳”。顾名思义,Shell就像是一个外壳一样。就我理解而言,Shell本身是一段程序,它运行起来后,可以和内核来打交道。它是相对于内核来说的,建立在内核的基础上,面向于用户的一种表现形式。就好比我们看到一个球体,见到的只是外壳,并非内核。
Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息。

我用下图来表示时间的流逝(从左到右)以及事件发生的次序。shell从用户读入字符串“ls”,shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。然后shell又读取新的一行,建立新的进程,做同上的工作。
在这里插入图片描述
综上,我们可以总结出来,要实现一个迷你shell,必须循环以下步骤:
(1)获取命令行
(2)解析命令行
(3)建立一个子进程(fork())
(4)替换子进程(execvp())
(5)父进程等待子进程退出(wait())
具体代码如下:

#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;
	    argc++;
	    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");
	exit(EXIT_FAILURE);
	break;
	case 0:
	execvp(argv[0], argv);
	perror("execvp");
	exit(EXIT_FAILURE);
	default:
	{
	    int st;
	    while(wait(&st) != pid)
		;
	}
    }
}

int main()
{
    char buf[1024] = {};
    while(1)
    {
	printf("MyShell> ");
	scanf("%[^\n]%*c", buf);
	do_parse(buf);
	do_execute();
    }
    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章