最近学习linux,打开linux虚拟机在一个“黑框框”中敲下一些命令,就能对应的执行一些操作,通过对shell的进一步学习,对它的底层实现产生了浓厚的兴趣,应该通过学习,下面实现一个简单的迷你版的myshell。
一、myshell的执行过程。
1.获取命令行。
2.解析命令行。
3.建立一个子进程。
4.替换子进程。
5.父进程等待子进程退出。
二、根据前面的思路和学过的知识,下面是实现的代码。
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>
void Parse(char buf[],char* argv[])
{
size_t argc = 0;
char* ptr = strtok(buf," ");
argv[argc++] = ptr;
while(ptr!= NULL)
{
ptr = strtok(NULL," ");
argv[argc++] = ptr;
}
argv[argc] = NULL;
return;
}
void Exec(char* argv[])
{
pid_t ret = fork();
if(ret > 0){
wait(NULL);
}else if(ret == 0)
{
execvp(argv[0],argv);
perror("execvp");
}else{
perror("fork");
}
return;
}
void Run(){
//1.从标准输入中读入一个字符串
while(1){
printf("[myshell]$");
char buf[1024] = {0};
gets(buf);
//2.解析字符串
char* argv[100] = { NULL };
Parse(buf,argv);
//3.创建一个子进程来执行命令
Exec(argv);
}
}
void TestParse()
{
char str[] = " ls -a ./ ";
char* argv [100]= {NULL};
Parse(str ,argv);
size_t i = 0;
for(;argv[i] != NULL; ++i){
printf("argv[%lu]",i);
}
}
int main()
{
Run();
//TestParse();
return 0;
}
三、运行截图。
四、总结。
实现的myshell只是一个简单的迷你版的shell,只包含一些简单的功能,还有很多不足和缺点,希望在以后更深入的学习中,进一步完善它的功能。