Shell的概念
Shell俗称壳,是Linux操作系统的外壳
Shell又称为命令行解释器,它接受用户输入的命令,然后调用相关的程序
模拟实现Shell步骤
1、打印Shell提示符,给用户输入的提示
2、定义一块空间接受用户的输入字符,以便对用户输入的内容进行处理
3、定义一块指针数组,将用户输入的内容按照空格依次存储
4、创建子进程进行程序替换
如何模拟实现重定向的功能
1、将字符串中'>'及之后的内容不做处理
2、关闭标准输出,不让其输出到屏幕上
3、利用fopen打开需要写入的文件,进行写入
代码实现
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<pwd.h>
int main()
{
while(1)
{
//step1:打印shell的提示符号
printf("[myshell@myhost]#");
fflush(stdout);
//step2:读入缓冲区
char buf[1024];//用来存入读入的字符
ssize_t s = read(0,buf,sizeof(buf)-1);
if(s > 0)
{
//在读的时候会读入‘\n’,需要将'\n'该为'\0'
buf[s-1] = 0;
}
else
{
continue;
}
//step3:将读入的字符存入对应的指针数组中
char* _argv[32];
_argv[0] = buf;
char* start = buf;
int i = 0;
while(*start)
{
if(*start == ' ' && *(start+1) != '\0')
{
*start = '\0';
start++;
_argv[++i] = start;
}
else
{
start++;
}
}
_argv[i+1] = NULL;
//step4:创建子进程调用exec()函数进行程序替换
pid_t id = fork();
if(id == 0)//child
{
int j = 0;
//实现重定向
for(j = 0; j<=i ; ++j)
{
if(strcmp(_argv[j],">") == 0)
{
char* file = _argv[j+1];
_argv[j] = NULL;
close(1);//关闭标准输出
open(file,O_WRONLY|O_CREAT,0666);
break;
}
}
//进行程序替换
execvp(_argv[0],_argv);
exit(0);
}
else//father
{
int status = 0;
pid_t ret = waitpid(id,&status,0);
}
}
return 0;
}