📄 shell1.c
字号:
#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<string.h>#include<wait.h>#include<fcntl.h>#define COM_SIZE 20#define COM_COUNT 10#define INPUT_SIZE 100int inCommand(char* str,int& flag);int get_com(char str[]);void initial(char arg[][COM_SIZE],char* argv[]);int pipe_com(char* argv[]); int do_command(char* argv[],int& argc );int getone(char* argv1,int ptr,char str[]);int del_space(int ptr,char str[]);int deal_com(char* argv[],int argc,char str[]);void exe_com(char* argv[],int argc,int prefd[],int postfd[]);int inFile(char* argv[],int argc);int ppipe(char* argv[],int& argc);int main(){ char c; char arg[COM_COUNT][COM_SIZE]; char str[INPUT_SIZE]; char* argv[COM_COUNT]; int flag=0; int status=0; int argc=0;// char*pa; while(1) { initial(arg,argv); printf("[nenatee@localhost~]#\n"); get_com(str); if(inCommand(str,flag)==1)//exit { exit(1); //bug!! } else { argc=deal_com(argv,argc,str); pid_t PID; PID=fork(); if(PID==0) { do_command(argv,argc);// ppipe(argv,argc);// inFile(argv,argc);/* if(execvp(argv[0],argv)==-1) { printf("命令不存在\n"); exit(1); }*/ } else { waitpid(PID,NULL,0); } } flag=0; argc=0; } exit(0);}int inFile(char* argv[],int argc)//,int infile,int outfile){ int i=0,infile=-1,outfile=-1; while(argv[i]){ if(strcmp(argv[i],"<")==0) infile=i; if(strcmp(argv[i],">")==0) outfile=i; i++; } if(infile>=0) { if(access(argv[infile+1],F_OK)!=0) { printf("No such file\n"); return 0; } } pid_t pid=fork(); if(pid==0) { if(outfile>=0) { int fid=open(argv[outfile+1],O_WRONLY|O_CREAT); printf("fjk\n"); close(1); dup(fid); close(fid); argv[outfile]=(char*)0;// argv[outfile+1]=NULL; execvp(argv[0],argv); } if(infile>=0) { int fid2=open(argv[infile+1],O_RDONLY); close(0); dup(fid2); close(fid2); argv[infile]=(char*)0; execvp(argv[0],argv); } // execvp(argv[0],argv); } else wait((int*)0); return 0;}int do_command(char* argv[],int& argc){ int i=0,j=0; int flag=0; char* p; if(strcmp(argv[0],"cd")==0) { int res=0; if(argv[1]!=NULL) { res=chdir(argv[1]); } else printf("Change dir error!\n"); if(res<0) printf("Change dir error\n"); return 1; } while(argv[i]) { flag=0; p=argv[i]; if(strcmp(argv[i],"|")==0) flag=1; if(strcmp(argv[i],">")==0) flag=2; if(strcmp(argv[i],"<")==0) flag=3; // printf("%d\n",flag); if(flag>0) { switch(flag) { case 3: { if(access(argv[i+1],F_OK)!=0) { printf("No such file\n"); return 0; } int fid2=open(argv[i+1],O_RDONLY); close(0); dup(fid2); close(fid2); argv[i]=(char*)0; execvp(argv[0],argv); break; } case 2: { int fid=open(argv[i+1],O_WRONLY|O_CREAT); // printf(">>\n"); close(1); dup(fid); close(fid); argv[i]=(char*)0; execvp(argv[0],argv); break; } case 1: { ppipe(argv,argc); break; } default: break; } } i++; } if(execvp(argv[0],argv)==-1) { printf("命令不存在!\n"); exit(1); }// execvp(argv[0],argv); return 0;}int ppipe(char* argv[],int& argc){ int i=0,j=0; char* pt; while(argv[i]) { pt=argv[i]; if(strcmp(argv[i],"|")==0) { argv[i]='\0'; if(argc==i+1)//huan zhong tiaojian ceshi keyi .the string can't be clr. { execvp(argv[0],argv); } int pfd[2]; pipe(pfd); int pid1=fork(); //pid_t?? if(pid1==0) { close(pfd[0]); close(1); dup(pfd[1]); close(pfd[1]); execvp(argv[0],argv); } else { argv[i]=pt; waitpid(pid1,NULL,0); int m,n; for(m=i+1,n=0;argv[m]!='\0';m++,n++) { strcpy(argv[n],argv[m]); } argv[n]='\0'; // char ** arg=argv+i+1; int argc1=argc-i-1; close(pfd[1]); close(0); dup(pfd[0]); close(pfd[0]); if(argv[0]!=NULL) { ppipe(argv,argc1); } } } i++; } execvp(argv[0],argv); return 0;}int deal_com(char* argv[],int argc,char str[]){ int ptr=0; int i=0; ptr=del_space(ptr,str); int outfile=-1; int infile=-1; int ispipe=-1; while(str[ptr]!='\0') { argv[i]=(char*)malloc(sizeof(char)*30); ptr=getone(argv[i],ptr,str); if(strcmp(argv[i],">")==0) outfile=i; else if(strcmp(argv[i],"<")==0) infile=i; else if(strcmp(argv[i],"|")==0) ispipe=i; i++; argc++; ptr=del_space(ptr,str); } argv[i]='\0'; return argc; }int del_space(int ptr,char str[]){ while(str[ptr]==' ') ptr++; return ptr;}int getone(char* argv1,int ptr,char str[]){ // printf("getone start\n"); char temp[20]; int i=0; if(str[ptr]=='>'||str[ptr]=='<'||str[ptr]=='|') { temp[i++]=str[ptr++]; } else { while((str[ptr]>='a'&&str[ptr]<='z')||(str[ptr]>='A'&&str[ptr]<='Z') ||str[ptr]=='_'||str[ptr]=='-'||str[ptr]=='/'||str[ptr]=='.'||(str[ptr]>='0'&&str[ptr]<='9')) { temp[i++]=str[ptr++]; } } temp[i]='\0'; strcpy(argv1,temp); return ptr;}int get_com(char str[]){ char c; int i=0; c=getchar(); while(c!='\n') { str[i]=c; c=getchar(); i++; } str[i]='\0'; return 1;}void initial(char arg[COM_COUNT][COM_SIZE],char* argv[]){ int s=0,d=0;// printf("initial\n"); for(s;s<COM_COUNT;s++)//每次调用命令之前对参数进行初始化... { for(d;d<COM_SIZE;d++) arg[s][d]='\0'; argv[s]=NULL; }}int inCommand(char* str,int& flag)//内部命令{ if(strcmp(str,"exit")==0) { flag=1; return 1; } if(strcmp(str,"logout")==0) { flag=1; return 1; } return 0;}/*void cd_com(char* argv[]){ int res=0; if(argv[1]!=NULL) { res=chdir(argv[1]); } else printf("Change dir error!\n"); if(res<0) printf("Change dir error\n"); return;}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -