【C语言】实现一个简单SHELL应用

【C语言】实现一个简单SHELL应用

#include <csapp.h>
#define MAXARGS 128
void eval(char *cmdline);
int parseline(char *buf,char **argv);
int builtin_command(char **argv);
int main(void) {

	char cmdline[MAXLINE];

	while(1){
		/* Read */
		printf("> ");
		fgets(cmdline,MAXLINE,stdin);
		if(feof(stdin)){
			exit(0);
		}

		/* evaluate */

		eval(cmdline);
	}

	return EXIT_SUCCESS;
}

/* eval - evaluate a command line*/
void eval(char *cmdline){
	char *argv[MAXARGS];
	char buf[MAXLINE];
	int bg;
	pid_t pid;

	strcpy(buf,cmdline);
	bg = parseline(buf,argv);
	if(argv[0] == NULL){
		return;
	}

	if(!builtin_command(argv)){
		if((pid=fork())==0){
			if(execve(argv[0],argv,environ) < 0){
				printf("%s: Command not found.\n",argv[0]);
				exit(0);
			}
		}

		if(!bg){
			int status;
			if(waitpid(pid,&status,0) < 0){
				printf("waitfg waitpid error");
			}
		}

		else{
			printf("%d,%s",pid,cmdline);
		}
	}

	return;
}

int builtin_command(char **argv){
	if(!strcmp(argv[0],"quit"))
		exit(0);
	if(!strcmp(argv[0],"&"))
		return 1;
	return 0;
}


int parseline(char *buf,char **argv){
	char *delim;
	int argc;
	int bg;
	buf[strlen(buf)-1] = ' ';
	while(*buf && (*buf == ' '))
		buf++;

	argc = 0;
	while((delim = strchr(buf,' '))){
		argv[argc++] = buf;
		*delim = '\0';
		buf = delim + 1;
		while(*buf && (*buf == ' '))
			buf++;
	}

	argv[argc] = NULL;

	if (argc == 0)
		return 1;
	if((bg = (*argv[argc-1] == '&')) != 0)
		argv[--argc] = NULL;
	return bg;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值