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();
	}
}

  

原文地址:https://www.cnblogs.com/rimochiko/p/8250248.html