📄 myshell.c
字号:
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>#include <string.h>#include <time.h>#include <sys/timeb.h>void sig_usr1(int sig);
extern char **getline();
double trans16(char*);double pow(double,double);int checkdigit(char*);int checkxdigit(char*);
main() {
int i;
char **args; FILE *in;
while(1) { printf("Myshell $:");
args = getline();
if(!(strcmp(args[0],"exit"))) exit(0);//end for if,the 0 level; else if(!(strcmp(args[0],"time"))){ time_t timep; time(&timep); printf("%s",asctime(gmtime(&timep))); printf("%s",ctime(&timep)); clock_t s;s=clock(); printf("%s\n",s); struct timeb tp; ftime(&tp); printf("time:%d\nmillitm:%d\ntimezone:%d\ndstflag:%d\n", tp.time,tp.millitm,tp.timezone,tp.dstflag);} else if(!(strcmp(args[0],"ld"))){ pid_t pid; if((pid=fork())<0){ printf("error fork."); exit(0);} else if(pid == 0){ in=freopen("aaa","w",stdout); execvp("ls",0); } else {wait(NULL);} }//end for else if,the 0 level; else if(!(strcmp(args[0],"la"))){ pid_t pid; if((pid=fork())<0){ printf("error fork."); exit(0);} else if(pid == 0){ sigset(SIGUSR1,sig_usr1); sighold(SIGUSR1); execvp("ls",args);} else sigignore(SIGUSR1); }//end for else if,the 0 level; else if(!(strcmp(args[0],"ls"))){ char *buff[1000]; int fd[2]; pid_t pid; pid_t pid2; if(pipe(fd)<0) printf("pipe error"); if((pid=fork())<0) printf("fork error"); else if (pid==0){ close(fd[1]); popen("ls -l |more","w"); read(fd[0],buff,1000); printf("%s",buff); close(fd[0]); } else{ close(fd[0]); //freopen("text","w",stdout); // execvp("ls",args); write(fd[1],"text",sizeof("text")); close(fd[1]); }}//end for else if "ls",the 0 level; else if(!strcmp(args[0],"args")){ i=1;int count=0,j=0; for(;args[i]!=NULL;i++) { if(!strcmp(args[i],"\"")) { j=(j+1)%2;if(j==0)count++; } else if(j==0)count++; else; } printf("argc = %d , args = ",count);//display the beginning of the output. j=0; for(i=1;args[i]!=NULL;i++) { if(!strcmp(args[i],"\"")) { if(j==0||args[i+1]==NULL)printf("%s",args[i]); else printf("%s ,",args[i]); j=(j+1)%2; } else if(j==1) printf("%s ",args[i]); else { if(args[i+1]==NULL)printf("%s ",args[i]); else printf("%s , ",args[i]); } } printf("\n");}//end for else if "args " the 0 level; else if(!strcmp(args[0],"add")) { int sign=1; double sum=0;int j=0; for(i=1;args[i]!=NULL;i++) { if(strncmp(args[i],"0x",2)!=0) { if(checkdigit(args[i])) sum=sum + atof(args[i]); else {sign=0;break;} } else { if(checkxdigit(args[i]+2)) sum=sum +trans16(args[i]); else {sign=0;break;} } } if(sign==1) for(j=1;j<i;j++) { printf("%s",args[j]); if(j==i-1) printf(" = %f\n",sum); else printf(" + "); } else printf("There exists a error at ->%s;\n",args[i]); }//end for else if,the 0 level;
}//end for while loop;
}//end for main function;void sig_usr1(int sig){ sigset(sig,sig_usr1); return;}//end for sig_usrl();int checkdigit(char *a){int size=strlen(a);int i=0;int sign=1;for(;i<size;i++){if(!isdigit(a[i])){sign=0;break;}}return sign;}//check for checkdigit();int checkxdigit(char *a){int size=strlen(a);int i=0;int sign=1;for(;i<size;i++){if(!isxdigit(a[i])){sign=0;break;}}return sign;}//end for checkdigit();
double trans16(char*a){a=a+2;int size=strlen(a);double sum=0;int i=0;for(i=0;i<size;i++){int x=isdigit(a[i])?(a[i]-48)*(pow(16.0,size-i-1)):(a[i]-97+10)*(pow(16.0,size-i-1));sum=sum+x;}return sum;}//end for trans16();double pow(double x,double y){int sum=1;int i=0;for(i=0;i<(int)y;i++)sum=sum*x;return sum;}//end for pow();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -