⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 backups.txt

📁 大学操作系统课程实验:Linux下实现的一个shell解释器。能够比较完整完好地执行Linux下的普通命令、重定向命令、管道命令等多种命令。
💻 TXT
字号:
		/*获取用户输入*/
		while((c=getchar())==' '||c=='\t'||c==EOF)
			;
		if(c=='\n')
			continue;
		while(c!='\n')
		{
			buf[input_len++]=c;
			c=getchar();
		}
		buf[input_len]='\0';
		input=(char *)malloc(sizeof(char)*(input_len+1));
		strcpy(input,buf);




		/*解析命令*/
		/**管道命令和重定向命令**/
		for(i=0,j=0,k=0;i<=input_len;i++)
			if(input[i]=='<'||input[i]=='>'||input[i]=='|')
			{
				if(input[i]=='|')
				{
					pipel(input,input_len);
					addHistory(input);
					free(input);
				}
				else
				{
					redirect(input,input_len);
					addHistory(input);
					free(input);
				}
				is_pr=1;
				break;
			}
			
		/**普通命令**/
		if(is_pr==1)
			continue;
		for(i=0,j=0,k=0;i<=input_len;i++)
		{
			if(input[i]==' '||input[i]=='\0')
			{
				if(j==0)
					continue;
				else
				{
					buf[j++]='\0';
					arg[k]=(char *)malloc(sizeof(char)*j);
					strcpy(arg[k++],buf);
					j=0;
				}
			}
			else
			{
				if(input[i]=='&'&&input[i+1]=='\0')
				{
					is_bg=1;
					continue;
//				}
//				buf[j++]=input[i];
//			}
//		}
//		
//		/**内部命令**/
//		/***exit命令***/
//		if(strcmp(arg[0],"exit")==0)
//		{
//			addHistory(input);
//			printf("Bye!\n");
//			free(input);
//			break;
//		}
//		/***history命令***/
//		if(strcmp(arg[0],"history")==0)
//		{
//			addHistory(input);
//			history_cmd();
//			free(input);
//			continue;
//		}
//		/***cd命令***/
//		if(strcmp(arg[0],"cd")==0)
//		{
//			addHistory(input);
//			for(i=3,j=0;i<=input_len;i++)
//				buf[j++]=input[i];
//			buf[j]='\0';
//			arg[1]=(char *)malloc(sizeof(char)*j);
//			strcpy(arg[1],buf);
//			cd_cmd(arg[1]);
//			free(input);
//			continue;
//		}
//		/***jobs命令***/
//		if(strcmp(arg[0],"jobs")==0)
//		{
//			addHistory(input);
//			jobs_cmd();
//			free(input);
//			continue;
//		}
//		/***bg命令***/
//		if(strcmp(arg[0],"bg")==0)
//		{
//			addHistory(input);
//			for(i=0;i<=input_len;i++)
//				if(input[i]=='%')
//					break;
//			for(++i;i<=input_len;i++)
//				buf[j++]=input[i];
//			buf[j]='\0';
//			arg[1]=(char *)malloc(sizeof(char)*j);
//			strcpy(arg[1],buf);
//			bg_cmd(atoi(arg[1]));
//			free(input);
//			continue;
//		}
//		/***fg命令***/
//		if(strcmp(arg[0],"fg")==0)
//		{
//			addHistory(input);
//			for(i=0;i<=input_len;i++)
//				if(input[i]=='%')
//					break;
//			for(++i;i<=input_len;i++)
//				buf[j++]=input[i];
//			buf[j]='\0';
//			arg[1]=(char *)malloc(sizeof(char)*j);
//			strcpy(arg[1],buf);
//			fg_cmd(atoi(arg[1]));
//			free(input);
//			continue;
//		}
//		
//		/*寻找命令文件*/
//		if(is_pr==0)
//		{
//			arg[k]=(char *)malloc(sizeof(char));
//			arg[k]=NULL;
//			if(isFounded(arg[0])==0)
//			{
//				printf("This command is not founded!\n");
//				for(i=0;i<=k;i++)
//					free(arg[i]);
//				continue;
//			}
//		}
//		addHistory(input);
//		
//		/*执行命令*/
//		if((pid=fork())==0)
//		{
//			if(is_bg==1)
//				while(sig_flag==0)
//					signal(SIGUSR1,setFlag);
//				sig_flag=0;
//				execv(buf,arg);
//		}
//		else
//		{
//			pid1=pid;
//			if(is_bg==1)
//			{
//				addNode(input,pid1);
//				kill(pid,SIGUSR1);
//				pid1=0;
//			}
//			if(is_bg==0)
//				waitpid(pid,&status,0);
//		}
//		if(is_bg==1)
//			sleep(1);
//		for(i=0;i<k;i++)
//			free(arg[i]);
//		free(input);
//	}
//


int redirect(char *in,int len)
{
	char *argv[20],*filename[20];
	pid_t pid;
	int i,j,k,fd_in,fd_out,is_in=-1,is_out=-1,num=0;
	int is_back=0,status=0;
	
	/*命令解析*/
	for(i=0,j=0,k=0;i<=len;i++)
	{
		if(in[i]==' '||in[i]=='\t'||in[i]=='\0'||in[i]=='<'||in[i]=='>')
		{
			if(in[i]=='>'||in[i]=='<')
			{
				if(num<3)
				{
					num++;
					if(in[i]=='<')
						is_in=num-1;
					else
						is_out=num-1;
						
					if(j>0&&num==1)
					{
						buf[j++]='\0';
						argv[k]=(char *)malloc(sizeof(char)*j);
						strcpy(argv[k],buf);
						k++;
						j=0;
					}
				}
				else
				{
					printf("Error command!\n");
					return 0;
				}
			}
			if(j==0)
				continue;
			else
			{
				buf[j++]='\0';
				if(num==0)
				{
					argv[k]=(char *)malloc(sizeof(char)*j);
					strcpy(argv[k],buf);
					k++;
					j=0;
				}
				else
				{
					filename[status]=(char *)malloc(sizeof(char)*j);
					strcpy(filename[status++],buf);
					j=0;
				}
			}
		}
		else
		{
			if(in[i]=='&'&&in[i+1]=='\0')
			{
				is_back=1;
				continue;
			}
			buf[j++]=in[i];
		}
	}
	
	/*寻找命令文件*/
	argv[k]=(char *)malloc(sizeof(char));
	argv[k]=(char *)0;
	
	if(isFounded(argv[0])==0)
	{
		printf("This command is not founded!\n");
		for(i=0;i<=k;i++)
			free(argv[i]);
		return 0;
	}
	
	/*命令的执行*/
	if((pid=fork())==0)
	{
		if(is_out!=-1)
		{
			if((fd_out=open(filename[is_out],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1)
			{
				printf("Can't open %s \n",filename[is_out]);
				return 0;
			}
		}
		if(is_in!=-1)
		{
			if((fd_in=open(filename[is_in],O_RDONLY,S_IRUSR|S_IWUSR))==-1)
			{
				printf("Can't open %s \n",filename[is_out]);
				return 0;
			}
		}
		if(is_out!=-1)
		{
			if(dup2(fd_out,STDOUT_FILENO)==-1)
			{
				printf("Redirect standard out error!\n");
				exit(1);
			}
		}
		if(is_in!=-1)
		{
			if(dup2(fd_in,STDIN_FILENO)==-1)
			{
				printf("Redirect standard in error!\n");
			}
		}
		printf("%s\n",buf);
		printf("%s\n",argv);
		execv(buf,argv);
	}
	else
	{
		if(is_back==0)
			waitpid(pid,&status,0);
	}
	
	/*释放空间*/
	for(i=0;i<=k;i++)
		free(argv[i]);
	if(is_out!=-1)
	{
		free(filename[is_out]);
		close(fd_out);
	}
	if(is_in!=-1)
	{
		free(filename[is_in]);
		close(fd_in);
	}
	
	return 0;
}



/*命令解析*/
	for(i=0,j=0,k=0;i<=len;i++)
	{
		if(input[i]==' '||input[i]=='\t'||input[i]=='\0'||input[i]=='<'||input[i]=='>'||input[i]=='\n')
		{
			if(input[i]=='|'||input[i]=='>')
			{
				if(input[i]=='>')
					flag=1;
				if(j>0)
				{
					buf[j++]='\0';
					argv[li_cmd][k]=(char *)malloc(sizeof(char)*j);
					strcpy(argv[li_cmd][k],buf);
					k++;
				}
				argv[li_cmd][k]=(char *)0;
				li_cmd++;
				k=0;
				j=0;
			}
			if(j==0)
				continue;
			else
			{
				buf[j++]='\0';
				if(flag==0)
				{
					argv[li_cmd][k]=(char *)malloc(sizeof(char)*j);
					strcpy(argv[li_cmd][k],buf);
					k++;
				}
				else
				{
					filename[0]=(char *)malloc(sizeof(char)*j);
					strcpy(filename[0],buf);
				}
			}
			j=0;
		}
		else
		{
			if(input[i]=='&'&&input[++i]=='\0')
			{
				is_bg=1;
				continue;
			}
			buf[j++]=input[i];
		}
	}
	
	argv[li_cmd][k++]=NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -