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

📄 myshell.c

📁 操作系统课程中,命令行解释程序,可以把用户输入的命令翻译为计算机可以执行的语言.
💻 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 + -