zoukankan      html  css  js  c++  java
  • 自己实现一个shell

      用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='';

                  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(" ");

      }

    }

     int main()

    {

      myShell();

      return 0;

    }

  • 相关阅读:
    sqli-labs(十七)
    sqli-labs(十六)(order by注入)
    sqli-labs(十五)(堆叠注入)
    spring boot热部署
    java之定时任务
    python之字符串函数
    java加载配置文件信息
    python之运算符与基本数据类型
    python基础
    python介绍
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6407095.html
Copyright © 2011-2022 走看看