【Linux】shell的简单模拟

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值