c语言简易实现linux终端


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



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值