博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己实现一个shell
阅读量:5020 次
发布时间:2019-06-12

本文共 1440 字,大约阅读时间需要 4 分钟。

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

  exec函数实际上是六种以exec开头的函数,统称exec函数。当进程调用exec函数时,该进程的用户空间和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec函数前后该进程的id并未改变。exec函数中execve是系统调用,剩下的其他都是适用于不同场景下,稍有不同,因此在这里就不赘述了。

  自己实现shell的代码如下:

   #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;

}

转载于:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6407095.html

你可能感兴趣的文章
MySQL性能测试工具之mysqlslap使用详解
查看>>
深入理解jsonp跨域请求原理
查看>>
regsvr32注册COM组件失败
查看>>
jmeter,CSV数据加载、数据库连接、正则
查看>>
MySQL学习点滴 --分区表
查看>>
4.6.1 测试基础
查看>>
洛谷 P2486 [SDOI2011]染色
查看>>
oo第三单元总结
查看>>
leetcode : Count and Say [基本功]
查看>>
洛谷 P2485 [SDOI2011]计算器 解题报告
查看>>
Slickflow.NET 开源工作流引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
查看>>
Node教程
查看>>
java将字段映射成另一个字段,关于 接口传参 字段不对应转换
查看>>
Redis
查看>>
HTTP(一)工作机制
查看>>
条形码扫描枪数据读取的问题
查看>>
健壮的 Java 基准测试
查看>>
phpstorm查看类的继承关系
查看>>
git create clone(仓库)
查看>>
矩阵求逆
查看>>