模拟实现shell

**编写思路:**对输入的命令先进行字符串解析,将字符串分成一个一个的,然后创建子进程,在调用进程替换函数执行输入字符串的命令。

//本程序实现一个基本的minihell程序
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/wait.h>
#include <ctype.h>
int main()
{
	while(1)
	{
		printf("[cq@localhost]$ ");
		fflush(stdout);

		char tmp[1024] = {0};
		scanf("%[^\n]%*c",tmp);
		printf("[%s]\n",tmp);
		//"ls -a -l" ->"ls" "-a" "-l"
		char *argv[32] = {NULL};
		int argc = 0;
		char *ptr = NULL;
		ptr = tmp;
		while(*ptr !='\0')
		{
			if(!isspace(*ptr))
			{
				argv[argc] = ptr;
				argc++;
				while(!isspace(*ptr) && *ptr != '\0') ptr++;
				*ptr = '\0';
				ptr++;
				continue;
			}
			ptr++;
		}
	//	int i;
	//	for(i = 0;i < argc;i++ )
	//	{
			//printf("argv[%d] = [%s]\n",i,argv[i]);
//		}
		argv[argc] = NULL;
		//判断当前命令是否是内建命令
		if(!strcmp(argv[0],"cd"))
		{
			chdir(argv[1]);
			continue;
		}


		int pid = fork();
		if(pid == 0)
		{
			//execlp(tmp,tmp,NULL);
			execvp(argv[0],argv);
			//若子进程程序替换失败,则直接退出,应为==因为终端不需要多个shell
			exit(0);
		}
		//等待子进程退出
		wait(NULL);
	}
	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值