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;
}
运行结果: