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

📄 shell_minix.c

📁 linux中的shell的实现 包括代码和题目
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <unistd.h> #include <sys/wait.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#define MAXSIZE 100int main(void) {	char *read_order(char *buffer);	char **order_name(const char *input);	int pipel(char * input);	int pipe_number(const char *input);	int redirect(char *input);	int order_number(const char *input);	char *path,*buffer;	char *all_order,**every_order;	int i,pipe,k,number;	if((buffer=(char *)malloc(MAXSIZE*(sizeof(char))))==0)	{		printf("error! can't malloc enough space for buffer\n");		return (0);	}	while(1)	{		path=getcwd(NULL,0);		printf("@myShell@");		all_order=read_order(buffer);		if(all_order==NULL)			continue;		number=order_number(all_order);		if (number<0)			continue;		every_order=order_name(all_order);		i=0;		while (i<number)		{			if(strlen(every_order[i])!=0)			{				k=pipe_number(every_order[i]);				if(k!=0)					pipel(every_order[i]);				else					redirect(every_order[i]);			}			i++;		}		for(i=0;i<number;i++)			free(every_order[i]);		free(every_order);		free(all_order);		free(path);	}}char **order_name(const char *input){	int order_number(const char *input);	int i,j,k,max_len;	char **order;		max_len=strlen(input);	k=order_number(input);	order=(char **)malloc(k*sizeof(char *));	for(i=0;i<k;i++)	{		order[i]=(char *)malloc((max_len+1)*sizeof(char));		order[i][0]='\0';	}	k=0;	j=0;	for (i=0;i<=max_len;i++)	{		if (input[i]!=';')		{			order[k][j]=input[i];			j++;		}		else		{			order[k][j]='\0';			k++;			j=0;		}	}	return order;}int order_number(const char *input){	int sum=0,i=0,len;	len=strlen(input);	while(i<len&&(input[i]==' '||input[i]=='	'))		i++;	if(input[i]==';')	{		fprintf(stderr," syntax error near unexpected token: ;\n");		return -1;	}	if (i==len)		return -1;	for (i=0;i<len;i++)	if(input[i]==';')	{		while(i<strlen(input)&&(input[i+1]==' '||input[i+1]=='	'))			i++;		if(input[i+1]==';')		{			fprintf(stderr," syntax error near unexpected token: ;;\n");			return -1;		}		else			sum++;	}	sum=sum+1;	return sum;}int pipel(char * input){	int redirect(char *input);	int is_back(char *order);	int pipe_number(const char *input);			int status,i,j,k,**fd,back=0,len;	char **order;	int *child;		back=is_back(input);	len=strlen(input);	k=pipe_number(input);	order=(char **)malloc((k+1)*sizeof(char *));	for(i=0;i<k+1;i++)		order[i]=(char *)malloc((len+1)*sizeof(char));	child=(int *)malloc((k+1)*sizeof(char *));	fd=(int **)malloc(k*sizeof(int *));	for(i=0;i<k;i++)		fd[i]=(int *)malloc(2*sizeof(int));		k=0;	j=0;	for (i=0;i<=len;i++)	{		if (input[i]!='|')		{			order[k][j]=input[i];			j++;		}		else		{			order[k][j]='\0';			k++;			j=0;		}	}	for(i=0;i<k;i++)		if(pipe(fd[i]) == -1) 		{			fprintf(stderr, "Open pipe error !\n");			return 0;		}	i=0;	if((child[i]=fork())==0)	{		close(fd[i][0]);		if(fd[i][1] != STDOUT_FILENO) 		{			if(dup2(fd[i][1], STDOUT_FILENO) == -1) 			{				fprintf(stderr, "Redirect Standard Out error !\n");				return -1;			}			close(fd[i][1]);		}		redirect(order[i]);			exit(1);	}	else	{		waitpid(child[i],&status,0);		close(fd[i][1]);	}	i++;	while(i<k)	{		if ((child[i]=fork())==0)		{			if(fd[i][0] != STDIN_FILENO) 			{				if(dup2(fd[i-1][0], STDIN_FILENO) == -1) 								{					fprintf(stderr, "Redirect Standard In error !\n");					return -1;				}				close(fd[i-1][0]);				if(dup2(fd[i][1], STDOUT_FILENO) == -1) 								{					fprintf(stderr, "Redirect Standard Out error !\n");					return -1;				}				close(fd[i][1]);			}			redirect(order[i]);			exit(1);		}		else		{			waitpid(child[i],&status,0);			close(fd[i][1]);			i++;		}	}	if((child[i] = fork()) == 0) 	{		close(fd[i-1][1]);		if(fd[i-1][0] != STDIN_FILENO) 		{			if(dup2(fd[i-1][0], STDIN_FILENO) == -1) 			{				fprintf(stderr, "Redirect Standard In error !\n");				return -1;			}			close(fd[i-1][0]);		}		redirect(order[i]);		exit(1);	}	else if(back==0)  	{		waitpid(child[i], NULL, 0);		close(fd[i-1][1]);	}	for(i=0;i<k;i++)		free(fd[i]);	free(fd);	for(i=0;i<k+1;i++)		free(order[i]);	free(order);	free(child);	return 1;}int pipe_number(const char *input){	int sum=0,i;	for (i=0;i<strlen(input);i++)	if(input[i]=='|')		sum++;	return sum;}void do_cd(char *argv[]){ 	if(argv[1]!=NULL)	{ 		if(chdir(argv[1])<0) 			switch(errno)		{ 			case ENOENT: 				fprintf(stderr,"DIRECTORY NOT FOUND\n"); 				break; 			case ENOTDIR: 				fprintf(stderr,"NOT A DIRECTORY NAME\n"); 				break; 			case EACCES: 				fprintf(stderr,"YOU DO NOT HAVE RIGHT TO ACCESS\n"); 				break; 			default: 				fprintf(stderr,"SOME ERROR HAPPENED IN CHDIR\n"); 		} 	}} int redirect(char *input){	char **analize(const char *input);	char *is_file_exist(const char *order);	void do_cd(char *argv[]);	int number(const char *input);	int is_back(char *order);	int pipe_number(const char *input);	char *order_path,*real_order;	char *out_filename,*in_filename;	char **analized_order;	int len,status,i,j,k,back=0,fd_out,fd_in,flag_out=0,flag_in=0;	pid_t pid;		back=is_back(input);	len=strlen(input);	out_filename=(char *)malloc((len+1)*(sizeof(char)));	in_filename=(char *)malloc((len+1)*(sizeof(char)));	real_order=(char *)malloc((len+1)*(sizeof(char)));	for(i=0;i<len;i++)	{		if (input[i]!='>'&&input[i]!='<')			real_order[i]=input[i];		else		{			if (input[i]=='>')				flag_out=1;			if (input[i]=='<')				flag_in=1;			break;		}	}	real_order[i]='\0';	i++;	if(flag_out==1&&input[i]=='>')	{		flag_out=2;		i++;	}	else if (flag_in==1&&input[i]=='<')	{		flag_in=2;		i++;	}	while ((input[i]==' '||input[i]=='	')&&i<len)		i++;	j=0;	out_filename[0]='\0';	in_filename[0]='\0';	if(flag_out>0)	{			while (i<=len)		{			if(input[i]=='<')			{				out_filename[j]='\0';				break;			}			out_filename[j]=input[i];			i++;			j++;		}	}	if(flag_in>0)		while (i<=len)		{			if (input[i]=='>')			{				in_filename[j]='\0';				break;			}			in_filename[j]=input[i];			i++;			j++;		}	if (i<len)	{		j=0;		if (flag_out>0&&input[i]=='<')		{			i++;			flag_in=1;			if(input[i]=='>')			{				flag_in=2;				i++;			}			while ((input[i]==' '||input[i]=='	')&&i<len)				i++;			while (i<=len)			{				in_filename[j]=input[i];				i++;				j++;			}		}		else if (flag_in>0&&input[i]=='>')		{			i++;			flag_out=1;			if(input[i]=='>')			{				flag_out=2;				i++;			}			while ((input[i]==' '||input[i]=='	')&&i<len)				i++;			while (i<=len)			{				out_filename[j]=input[i];				i++;				j++;			}		}		else		{			fprintf(stderr,"ERROR!can't find the file!\n");			return -1;		}	}		k=number(real_order);	analized_order=analize(real_order);	if(strcmp(analized_order[0], "leave") == 0)	{		printf("bye-bye\n");		for(i=0;i<k;i++)			free(analized_order[i]);		free(analized_order);		free(real_order);		exit(1);		return 1;	}	if (strcmp(analized_order[0],"cd")==0)	{		do_cd(analized_order);		for(i=0;i<k;i++)			free(analized_order[i]);		free(analized_order);		free(real_order);		return 1;	}	order_path=is_file_exist(analized_order[0]);	if(order_path==NULL)		{		fprintf(stderr,"This is command is not founded ?!\n");

⌨️ 快捷键说明

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