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

📄 myshell8.c

📁 本人自己写的模拟shell程序
💻 C
字号:
////////////////////////////////////////////////////////////
//	filename:	myshell8.c
//	maker:		zhangneng
//	time:		20041205
//////////////////////////////////////////////////////////////

#include <stdio.h>
#include <limits.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXINPUTLN 120
#define MAXARG 5
#define PIPELINE 5
#define MAXNAME 100
#define OPEN_MAX 10
#define PATHLN 50//

char inputln[MAXINPUTLN+1];
char *inputlnptr;
char avline[MAXINPUTLN+1];
char *avptr;
char infile[MAXNAME+1];
char outfile[MAXNAME+1];
char list_now[PATHLN+1];//
char re[MAXINPUTLN+1];//
char *reptr;		//

int background;
int lastpid;
int append;
struct cmd
{
	char *av[MAXARG];
	int infd;
	int outfd;
}cmdlin[PIPELINE];

void init_once();
void init_command();
int get_simcom();
void get_word(char *name);
int get_comln();
void run_com(struct cmd *ptr);
void execute(int j);
void get_simarg(int j);
int check(char *ptr);
void special();
void replace();

///////////////////////////////////////////////////////////
main(void)
{


	int j;
	init_once;
	for(;;)
	{
		init_command();
		if(get_comln())
		{
			replace();
			if(j=get_simcom())
			{
				special();
				execute(j);			
			}
		}

	}
	return 0;
}

//////////////////////////////////////////////////////////////
void init_once()
{
	printf("welcome to ZN's shell :)\n");
}

//////////////////////////////////////////////////////////////
void init_command()
{
	int k;
	background=FALSE;
	inputlnptr=inputln;
	avptr=avline;
	reptr=re;//
	infile[0]='\0';
	outfile[0]='\0';	
	append=FALSE;
	for(k=0;k<PIPELINE;++k)
	{
		cmdlin[k].infd=0;
		cmdlin[k].outfd=1;
	}
	for(k=3;k<=OPEN_MAX;k++)  
		close(k);
	getcwd(list_now ,PATHLN);//print rout
	printf("\n[now is in %s]enter command: # ",list_now);
	fflush(stdout);
}

////////////////////////////////////////////////////////
int get_comln()
{
	int i;
	memset((void*)inputln,0,MAXINPUTLN);
	//gets(inputln);
	fgets(inputln,MAXINPUTLN,stdin);
	if(inputln[MAXINPUTLN]!=0)
	{
		fprintf(stderr,"Command line too long\n");
		return(ERROR);
	}

	inputln[strlen(inputln)]='\n';
	return (OK);
}

/////////////////////////////////////////////////////////////
void replace()
{//	printf("%d  %s\n",strlen(inputln),inputln);
	//put '' to buffer
	char *ptr = inputlnptr;
	while(*ptr!='`'&&*ptr!='\n')
		ptr++;
	if(*ptr!='`')
		return ;
	char *first_ptr=ptr;

	ptr++;
	while(*ptr!='`'&&*ptr!='\n')
		*reptr++ = *ptr++;
	if(*ptr!='`')
		return ;
	char *second_ptr=ptr;
	
	*reptr++ = '>';
	*reptr++ = 'p';
	*reptr++ = '.';
	*reptr++ = 't';
	*reptr++ = 'x';
	*reptr++ = 't';
	*reptr++ = '\n';
	//	printf("%d  %s\n",strlen(inputln),inputln);//	printf("%d  %s\n",strlen(re),re);
	//do
	inputlnptr=re;
	int jj;//	printf("%d  %s\n",strlen(inputlnptr),inputlnptr);
	if(jj=get_simcom())
		execute(jj);

	//replace `` with file
   	FILE *stream;
   	char buffer[81];
  	 int  i, ch;

  	 /* Open file to read line from: */
  	 if( (stream = fopen( "p.txt", "r" )) == NULL )
   	   exit( 0 );

  	 /* Read in first 80 characters and place them in "buffer": */
  	 ch = fgetc( stream );
 	  for( i=0; (i < 80 ) && ( feof( stream ) == 0 ); i++ )
  	 {
  	    buffer[i] = (char)ch;
  	    ch = fgetc( stream );
  	 }

  		 /* Add null to end string */
   	buffer[i-1] = '\0';		//because the has palce a '\n' here
  	 
   	fclose( stream );

	
   	second_ptr++;//	printf( "%d  %d%s", i,strlen(buffer),buffer );//	printf( "%d%s", strlen(second_ptr),second_ptr );
  	 strcat(buffer,second_ptr);//	printf( "%s", buffer );
	*first_ptr='\0';
  	 strcat(inputln,buffer);
//	printf( "%s\n", inputln );

	//    inital here	int k;
	background=FALSE;
	inputlnptr=inputln;
	avptr=avline;
	reptr=re;//
	infile[0]='\0';
	outfile[0]='\0';
	
	append=FALSE;
	for(k=0;k<PIPELINE;++k)
	{
		cmdlin[k].infd=0;
		cmdlin[k].outfd=1;
	}
	for(k=3;k<=OPEN_MAX;k++)  
		close(k);
	fflush(stdout);
}

/////////////////////////////////////////////////
void get_simarg(int j)
{
	int i,tag,inword;
	for(i=0;i<MAXARG-1;i++)
	{
		while(*inputlnptr==' '||*inputlnptr=='\t')
	
			++inputlnptr;
		cmdlin[j].av[i]=avptr;
		cmdlin[j].av[i+1]=NULL;
		for(tag=0;tag==0;)
		{
			switch(*inputlnptr)
			{
			case ' ':
			case '\t':
				inword=FALSE;
				*avptr++='\0';
				tag=1;
				break;
			case '|':
			case '>':
			case '\n':
			case '<':
			case '&':
				if(inword==FALSE)
					cmdlin[j].av[i]=NULL;
				*avptr++='\0';
				return ;		////////////////////
			default:
				inword=TRUE;
				*avptr++=*inputlnptr++;
				break;
			}
		}
	}
}

////////////////////////////////////////////////////////
int get_simcom()
{
	int i;
	get_simarg(0);
	if(check("<"))
		get_word(infile);
	for(i=1;i<PIPELINE;i++)
		if(check("|"))
			get_simarg(i);
		else 
			break;
	if(check(">"))
	{
		if(check(">"))
			append=TRUE;
		get_word(outfile);
	}
	if(check("&"))
		background=TRUE;
	if(check("\n"))
		return(i);
	else
	{
		fprintf(stderr,"Command line syntax error\n");
		return (ERROR);
	}
}


//////////////////////////////////////////////////////////////
int check(char *ptr)
{
	char *tptr;
	while(*inputlnptr==' ')
		inputlnptr++;
	tptr=inputlnptr;
	while(*ptr!='\0'&& *ptr==*tptr)

	{
		ptr++;
		tptr++;
	}
	if(*ptr=='\0')
	{
		inputlnptr=tptr;
		return (TRUE);
	}
	else
	return (FALSE);
}

/////////////////////////////////////////////////
void get_word(char *name)
{
	int i;
	for (i=0;i<MAXNAME;i++)
	{
		switch(*inputlnptr)
		{
			case ' ':
			case '|':
			case '>':
			case '\n':
			case '<':
			case '&':
			case '\t':
				*name='\0';
				return;
			default:
				*name++=*inputlnptr++;
				break;
		}
	}
	*name='\0';
}

////////////////////////////////////////////////////////
void special()
{
	if(strcmp(cmdlin[0].av[0],"quit")==0 || strcmp(cmdlin[0].av[0],"exit")==0) 

	{
		printf("thanks for your using:)\n");
		exit(0);
	}

	if(strcmp(cmdlin[0].av[0],"cd")==0)
	{
		if(cmdlin[0].av[1]!="..")	
			chdir(cmdlin[0].av[1]);		
	}
}

//////////////////////////////////////////////////////////
void  execute(int j)
{
	int i,fd,fds[2];
	if(strcmp(cmdlin[0].av[0],"cd")==0)
	{
//		printf("%s\n",cmdlin[0].av[1]);
		if(cmdlin[0].av[1]!=NULL)
			chdir(cmdlin[0].av[1]);
		else
			chdir("cd ..");/////////////////////////////////////////////////////
	}
	if(infile[0]!='\0')
		cmdlin[0].infd=open(infile,O_RDONLY);
	if(outfile[0]!='\0')
		if(append==FALSE)
			cmdlin[j-1].outfd=open(outfile,O_WRONLY|O_CREAT|O_TRUNC,0666);
		else
			cmdlin[j-1].outfd=open(outfile,O_WRONLY|O_CREAT|O_APPEND,0666);
	if(background)
		signal(SIGCHLD,SIG_IGN);
	else
		signal(SIGCHLD,SIG_DFL);
	for(i=0;i<j;i++)
	{
		if(i<j-1)
		{
			pipe(fds);
			cmdlin[i+1].infd=fds[0];	
			cmdlin[i].outfd=fds[1];
		}
		run_com(&cmdlin[i]);
		if(fd=cmdlin[i].infd)
			close(fd);
		if((fd=cmdlin[i].outfd)!=1)
			close(fd);
	}
	if(background==FALSE)
	while(wait(NULL)!=lastpid);
}

//////////////////////////////////////////////////////////////////
void run_com(struct cmd * ptr)
{
	int k,pid;
	if(pid=fork())
	{
		if(background==TRUE)
		printf("%d\n",pid);
		lastpid=pid;
	}
	else 
	{
		if(ptr->infd==0 && background==TRUE)
		ptr->infd = open("/dev/null",O_RDONLY);
		if(ptr->infd!=0)
		{
			close(0);
			dup(ptr->infd);
		}
		if(ptr->outfd!=1)
		{
			close(1);
			dup(ptr->outfd);
		}
		if(background==FALSE)
		{
			signal(SIGINT,SIG_DFL);
			signal(SIGQUIT,SIG_DFL);
		}
		for(k=3;k<OPEN_MAX;k++)
			close(k);
		execvp(ptr->av[0],ptr->av);
		exit(1);
	}
}










 





⌨️ 快捷键说明

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