程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言簡易實現linux終端

c語言簡易實現linux終端

編輯:關於C語言

Linux系統的命令分為內部命令和外部命令兩種,內部命令由Shell程序實現,如cd、echo等,Linux的內部命令數量有限,而且絕大部分都很少用到。而每一個Linux外部命令都是一個單獨的應用程序,我們非常熟悉的ls、cp等絕大多數命令都是外部命令,這些命令都以可執行文件的形式存在,絕大部分放在目錄/bin和/sbin中。這樣一來,我們編程的難度就可以大大下降了,我們只需要實現很有限的內部命令,對於其它的輸入,統統當作應用程序來執行即可。
//MyShell.c
#include 
#include 
#include 
#include 
#include 

#define MAXSIZE 100

void info_print();

int main(int argc, char const *argv[])
{
	/* code */
	while(1){
		char command[MAXSIZE];
		pid_t pid;
		int status;
		info_print();
		bzero(command,MAXSIZE);
		gets(command);
		if(-1==(pid=fork())){
			perror(fork);
			exit(-1);
		}
		if(pid>0){
			wait(&status);
		}else{
			int i,flag=0,j=0;
			char *file,*argv[10];
			file=command; 
			argv[flag++]=command;
			for(i=0;command[i]!='';i++){
				while(command[i]==' '){
					command[i++]='';
					j=1;
				}
				if(1==j){
					argv[flag++]=command+i;
					j=0;
				}

			}
			argv[flag]=NULL;
			if(0==strncmp(file,cd,2)){
				//printf(OK%s
,argv[1]);
				if(-1==chdir(argv[1])){
					perror(chdir);
					exit(-1);
				}
			}else{
				if(-1==execvp(file,argv)){
					//perror(execvp);
					fprintf(stderr,%s: command not found
,file);
				}
			}
		}

	}
	return 0;
}
void info_print()	//打印提示信息
{
	char buf[MAXSIZE],*username,hostname[MAXSIZE],pwd[MAXSIZE],ch;
	bzero(buf,MAXSIZE);
	bzero(pwd,MAXSIZE);
	bzero(hostname,MAXSIZE);
	if(NULL==(username=getenv(USER))){
		printf(Error: get username failure!
);
		exit(-1);
	}
	if(NULL==getcwd(pwd,MAXSIZE)){
		perror(getcwd);
		exit(-1);
	}
	if(-1==gethostname(hostname,MAXSIZE)){
		perror(gethostname);
		exit(-1);
	}
	if(0==strcmp(username,root)){
		ch='#';
	}else{
		ch='$';
	}
	sprintf(buf,%s@%s:%s%c ,username,hostname,pwd,ch);
	fprintf(stdout,%s,buf);
}


						

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved