实现简单的shell

62 篇文章 54 订阅
56 篇文章 0 订阅

用讲过的各种C函数实现一个简单的交互式Shell,要求:给出提示符,让用户输入一行命令,识别程序名和参数并调用适当的exec函数执行程序,待执行完成后再次给出提示符。

实现过程中用到的函数:
这里写图片描述

这里写图片描述

这里写图片描述

代码:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<wait.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);              //pwd保存的是绝对路径
     int len=strlen(pwd);        
     char* p=pwd+len;
     while(*p!='/'&&len--)
     {
          p--;
     }
     p++;
     printf(" %s]#",p);
}


void myShell()
{
     while(1)
     {
          GetLoginName();
          GetHostName();
          GetDir();
          fflush(stdout);

          char line[1024];       //获取输入的命令,并解析
          ssize_t s=read(0,line,1024);
          char* myArgv[10];
          char* start=line;
          myArgv[0]=start;
          int i=1;
          if(s>0)
          {
               while(*start)        //以空格将输入的内容区分开
               {
                    if(isspace(*start))
                    {
                         while(isspace(*start))
                         {
                              *start='\0';
                              start++;
                         }
                         myArgv[i++]=start;
                    }
                    else
                    {
                         start++;
                      }

               }
          }
          else
          {
               continue;
          }
          myArgv[i-1]=NULL;


        pid_t id=vfork();      //fork子进程去执行输入的命令
          if(id==0)
          {

               execvp(myArgv[0],myArgv);
               perror("error ");
          }
          else
          {
               sleep(1);
               wait(NULL);
          }
          printf("\n");
     }
}

int main()
{
     myShell();
     return 0;
}

结果:
这里写图片描述

注意:
在自己的shell中可以试一下cd命令,发现会出现错误!!!这时因为cd是内建命令。
用户在命令行输入命令后,一般情况下shell会fork并exec该命令,但是shell的内建命令例外,执行内建命令相当于调用shell进程中的一个函数,并不创建新的进程。以前学过的cd、umask、exit等都是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值