• C语言模拟简单的shell


    如果是写作业到了这里,最好不要直接copy哦,仅供参考

    可以处理简单的命令,还有cd

    #include<stdio.h>
    #include<unistd.h>
    #include<string.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<pwd.h>
    int isExit=0;  //是否终止程序
    char username[100];   //当前用户名
    char dir[200];    //当前所在路径
    char dirname[100];   //当前所在路径文件夹
    char hostname[100];   //当前主机名
    //分割输入命令参数处理
    void splitCommend(char* commend,char** array){
            char cur[10];
            int len = strlen(commend);
            int i=0,j=0,k=0;
            while(i < len){
                    while(commend[i]!=' ' && i<len){
                            cur[j] = commend[i];
                            i++;
                            j++;
                            if(commend[i] == ' ' || i==len){
                                    cur[j]='';
                                    j=0;
    				array[k] = (char*)malloc(100*sizeof(char));
                                   	strcpy(array[k],cur);
                                    k++;
    				memset(cur,'',sizeof(cur));
    				break;
                            }
                    }
                    i++;
            }
    	array[k] = 0;
    }
    //获取当前用户名
    void getUsername(){
    	struct passwd *userInfo;
    	userInfo = getpwuid(getuid());
    	strcpy(username,userInfo->pw_name);
    }
    //获取当前主机名
    void getHostName(){
    	gethostname(hostname,sizeof(hostname));
    }
    //获取当前工作路径
    void getDir(){
    	char cur[100];
    	int i,j=0;
    	getcwd(dir,sizeof(dir));
    	if(strcmp(dir,"/root")==0){
    		strcpy(dirname,"~");
    		return;
    	}
    	for(i=0;i<strlen(dir);i++){
    		if(dir[i] == '/'){
    			j = 0;
    			continue;
    		}
    		cur[j]=dir[i];
    		j++;
    	}
    	cur[j]='';
    	if(strlen(cur)==0){
    		strcpy(cur,"/");
    	}
    	strcpy(dirname,cur);
    }
    //更改当前工作路径
    void changePath(char **param){
    	char homepath[100]={0};
    	int i;
    	if(param[1]==NULL || strlen(param[1])==0 || param[2]!=NULL){
    		printf("The fotmat is [cd pathname].
    ");
    		return;
    	}
    	if(param[1][0]=='~'){
    		if(strlen(param[1])==1){
    			param[1][0]='';
    		}
    		for(i=2;i<=strlen(param[1]);i++){
    			param[1][i-2] = param[1][i];
    		}
    
    		if(strcmp(username,"root")==0){
    			strcpy(homepath,"/root/");
    			strcat(homepath,param[1]);
    			if(chdir(homepath)==-1){
    				printf("The path is invalid.
    ");
    			}
    		} else {
    			strcat(homepath,"/home/");
    			strcat(homepath,username);
    			strcat(homepath,"/");
    			strcat(homepath,param[1]);
    			if(chdir(homepath)==-1){
    				printf("The path is invalid.
    ");
    			}
    		}
    		return;
    	}
    	if(chdir(param[1])==-1){
    		 printf("The path is invalid.
    ");
    	}
    	getDir();
    }
    //输出命令
    void inputCommend(){
    	char commend[100];
    	char* param[100];
    	char path[10]={"/bin/"};
    	int p1,i=0;
    	char *envp[] = {NULL};
    	getUsername();
    	getHostName();
    	getDir();
    	printf("[%s@%s %s]",username,hostname,dirname);
    	fgets(commend,100,stdin);
    	commend[strlen(commend)-1]='';
    	splitCommend(commend,param);
    	if(strcmp(param[0],"exit")==0 || strcmp(param[0],"quit")==0){
                 isExit=1;
                 return;
            }
    
    	if(strcmp(param[0],"cd")==0){
    		changePath(param);
    		return;
    	}
    
    	p1=fork();
    	if(p1==0){
    		if(execvp(param[0],param)==-1)
    			printf("Error Command.
    ");
    	} else {
    		wait(NULL);
    	}
    }
    int main(int argc,char** argv){
    	while(isExit==0){
    		inputCommend();
    	}
    }
    

      

  • 相关阅读:
    [心得]如何快速利用SqlMap做安全檢測
    [心得]群裡提問的流水序號產生方式
    STL中使用reverse_iterator时,如何正确使用erase函数
    西山居面试之旅
    LAMP兄弟连 视频教程集
    [译]理解Windows消息循环
    C++设计模式 -- 解析和实现
    winsock 收发广播包
    SqlServer sysobjects_table
    查询反模式
  • 原文地址:https://www.cnblogs.com/rimochiko/p/8250248.html
Copyright © 2020-2023  润新知