自己实现一个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='\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;

}

posted @ 2017-02-16 18:28  请叫我小小兽  阅读(1622)  评论(1编辑  收藏  举报