📄 myshell8.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 + -