模拟实现myshell

模拟实现myshell

直观地看来Linux下的Shell命令提示符:用户名@主机号 当前目录名  提示符
函数gethostname()可以获取到当前用户的主机号

原型如下:

#include 

int gethostname(char *name, size_t len);

参数说明:

这个函数需要两个参数:

接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名。

接收缓冲区name的最大长度

返回值:

如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变量errno中。

函数getcwd() 是获得执行程序的当前路径。 

为了做出区分,默认将主机名设置为root

代码如下:

 #include 
  #include 
  #include 
  #include 
  #include 
  #define HOSTLEN 256
   
   int main()
   {
      while(1)
      {
          char buf2[80];
          getcwd(buf3,sizeof(buf2));
          struct passwd *user;
          user=getpwent();
          char hostname[HOSTLEN];
          struct hostent *hp;
          gethostname(hostname,HOSTLEN);
          printf("[%s@%s %s]# ",user->pw_name,hostname,buf2);
          fflush(stdout);
          char buf[1024];
          ssize_t s=read(0,buf,sizeof(buf)-1);
          if(s>0)
         {
              buf[s-1]=0;
              printf("%s\n",buf);
          }
          char *start=buf;
          char * _argv[32];
          _argv[0]=start;
          int i=1;
          while(*start)
          {
              if(*start==' ')
              {
                  *start=0;
                  start++;
                  _argv[i++]=start;
              }
              else
              {
                  start++;
              }
          }
          _argv[i]=NULL;
          pid_t id=fork();
          if(id==0)
          {
              execvp(_argv[0],_argv);
          }
          else
          {
              pid_t ret=waitpid(id,NULL,0);
          }
      }
      return 0;
  }
代码运行结果:

模拟实现myshell_第1张图片

你可能感兴趣的:(Linux)