利用fork和exec实现简单的shell

经过前面对fork 和 exec 系列系统调用的学习,
我们已经对LINUX 的进程有了初步的了解,
为了加深理解,下面利用前面所学的知识来做一个shell,
当然只是一个简单的shell 而已,并没有提供什么新的特性
其实linux系统中的各种shell的基本框架应该也是差不多的

程序的主体框架如下:
while( gets(command) )
{
     analyse(command);
     runcommand(command);
}

程序不断地读取命令直到输入EOF
然后把参数分离,打包到字符指针数组argv 之中
最后新建一个进程运行命令

代码如下:

#include<stdio.h>
#include<unistd.h>
#define MAXSIZE 1024 

char command[MAXSIZE];
char *argv[MAXSIZE];
int argc;

int analyse();
void runcommand();

int main()
{ 
	printf("----------->>");
	while( gets(command) )
	{
		argc = analyse();
		argv[argc] = NULL;
		runcommand();
		printf("----------->>");
	}
	return 0;
}

int analyse()
{
	int i = 0;
	char *ptr = command;
	//将参数一个一个分开,保存在argv数组中
	while( *ptr != '\0' )
	{
		if( *ptr != ' ' && *ptr != '\t' )
		{
			argv[i++] = ptr++;
			while( *ptr != ' ' && *ptr != '\t' )
			{
				if( *ptr =='\0' )
					 return i;
				else ptr++;
			}
			*ptr = '\0';
		}
		ptr++;
	}
	return i;
}

void runcommand()
{
	pid_t pid;
	pid = fork();
	if( pid == 0 )
	{
		execvp(argv[0], argv);
		printf("command not found\n");
	}
	else if( pid > 0 )
	{
		wait(NULL);
	}
	else 
	{
		printf("fork error\n");
	}
}

你可能感兴趣的:(利用fork和exec实现简单的shell)