我们想要实现一个简单的shell,就得简单了解一下shell的运行原理:
首先从命令行拿到输入信息;然后对信息进行分析处理;之后是fork创建子进程,再让子进程执行程序替换,而父进程只用等待子进程退出就行;更简单的来说,要写一个shell,就需要循环以下过程:
1.获取命令行;2.解析命令行;3.建立一个子进程(fork);4.替换子进程(execvp);5.父进程等待子进程退出(wait)。
在Linux下具体实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
#define NUM 32
int main()
{
char buf[MAX];
char *myargv[NUM];
while(1)
{
printf("[yhx@localhost wsc]# ");
fflush(stdout);
fgets(buf, MAX, stdin);
buf[strlen(buf) - 1] = 0;
int i=0;
//①分析处理字符串
myargv[i]=strtok(buf," ");//拆分字符串
i++;
while(1)
{
char *p=strtok(NULL," ");
if(p==NULL)
{
myargv[i]=NULL;
break;
}
myargv[i]=p;
i++;
}
//②执行
pid_t pid=fork();//创建子进程进行程序替换
if(pid<0)//创建失败
{
;
}
else if(pid==0)//child
{
execvp(myargv[0],myargv);
}
else//parent
{
waitpid(pid, NULL, 0);
}
}
//execvp(myargv[0],myargv);
//for(i=0;myargv[i]!=NULL;i++)
//{
//printf("%d:%s\n",i,myargv[i]);
//}
//printf("%s",buf);
return 0;
}
程序执行后的结果:我们实现的shell可以实现基本的指令,如-ls -ll -pwd -touch等