首页 > 编程语言 > 详细

c语言简易实现linux终端

时间:2014-02-18 08:38:45      阅读:385      评论:0      收藏:0      [点我收藏+]
Linux系统的命令分为内部命令和外部命令两种,内部命令由Shell程序实现,如cd、echo等,Linux的内部命令数量有限,而且绝大部分都很少用到。而每一个Linux外部命令都是一个单独的应用程序,我们非常熟悉的ls、cp等绝大多数命令都是外部命令,这些命令都以可执行文件的形式存在,绝大部分放在目录/bin和/sbin中。这样一来,我们编程的难度就可以大大下降了,我们只需要实现很有限的内部命令,对于其它的输入,统统当作应用程序来执行即可。

//MyShell.c
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

#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]!=‘\0‘;i++){
				while(command[i]==‘ ‘){
					command[i++]=‘\0‘;
					j=1;
				}
				if(1==j){
					argv[flag++]=command+i;
					j=0;
				}

			}
			argv[flag]=NULL;
			if(0==strncmp(file,"cd",2)){
				//printf("OK%s\n",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\n",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!\n");
		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);
}


c语言简易实现linux终端

原文:http://blog.csdn.net/huangbo_embed/article/details/19343363

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!