学习shell的好方法——编写一个自己的shell

shell编程和写一个shell不是一回事,但如果写一次shell,再学习shell编程就简单了。

以下是本人编写的简易的交互式Shell。

需要用到的函数有:getpwuid,gethostname,getcwd



#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
#include<pwd.h>
#include<string.h>
void GetLoginName() //获取登录名
{
	struct passwd*pwd;
	pwd=getpwuid(getuid());
	printf("[%s@",pwd->pw_name);
}

void GetHostName()//获取主机名
{
	char name[100]={0};
	gethostname(name,sizeof(name)-1);
	printf("%s",name);
}

void GetDir()//获取当前工作路径
{
	char pwd[100]={0};
	getcwd(pwd,sizeof(pwd)-1);
	int len=strlen(pwd);
	char*p=pwd+len;
	while(*p!='/'&&len--)
	{
		p--;
	}
	p++;
	printf(" %s]#",p);
}

int main()
{
	while(1)
	{
	     	GetLoginName();
		GetHostName();
		GetDir();
		fflush(stdout);
		//sleep(5);
		char cmd[128];
		ssize_t _s=read(0,cmd,sizeof(cmd)-1);
		cmd[_s-1]='\0';
		if(_s>0)
		{
			cmd[_s]='\0';
		}
		else
		{	
			perror("read");
			return 1;
		}

		char *_argv[32];
		char *start = cmd;
		_argv[0]=cmd;
		int i = 1;
		while(*start)
		{
			if(isspace(*start))
			{
				*start = '\0';
				start++;
				_argv[i]=start;
				i++;
				continue;
			}
		
				start++;
		}
			pid_t id=fork();
			if(id<0)
			{
				perror("fork");
			}
			else if(id==0)
			{
					execvp(_argv[0],_argv);
					perror("error");
			}
			else
			{	
				int status = 0;
				pid_t ret = waitpid(id,&status,0);
				if(ret>0&&WIFEXITED(status))
				{
				//	sleep(1);
					//exit(1);
				}
				else
				{
					 perror("waitpid");
				}
			}
	}	
}
用户在命令行输入命令后,一般情况下shell会fork并exec该命令,但是shell的内建命令例外,执行内建命令相当于调用shell进程中的一个函数,并不创建新的进程。以前学过的cd、umask、exit等都是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值