用c++制作shell,尝试创建shell变量

Making a shell in c++, trying to create shell variables

本文关键字:shell 创建 变量 c++ 制作      更新时间:2023-10-16

所以我有一个相对简单的shell,它处理管道、chdir、重定向和运行程序。但我需要一种实现shell变量的方法,就像在普通shell中一样(例如HELLO=world(。

int main()
{
    while(true)
    {
        string result;
        char * left[128];
        char * right[128];
        cout << "$$ ";
        char command[128];
        cin.getline(command,128);
        if(strlen(command) != 0)
        {
           vector<char*>args;
           char* prog = strtok(command, " ");
           char* tmp = prog;
           while ( tmp != NULL )
           {
              args.push_back( tmp );
              tmp = strtok( NULL, " " );
           }    
           char** argv = new char*[args.size()+1];
           for ( int k = 0; k < args.size(); k++ )
           {
              argv[k] = args[k];
           }
           argv[args.size()] = NULL;
           if ( strcmp( command, "exit" ) == 0 )
           {
              return 0;
           }
           if(!strcmp(prog,"cd"))
           {
              chdir(argv);
           }
           if(prog[0] == '.')
           {        
              std::system(args[0]);
           }
           else
           {
              pid_t kidpid = fork();
              if(kidpid < 0)
              {
                 perror("Could not fork");
                 return -1;
              }
              else if (kidpid == 0)
              {
                 execvp(prog,argv);
              }
              else
              {
                 if(waitpid(kidpid,0,0) <0 )
                 {
                    return -1;
                 }
              }
          }
      }
  }
      return 0;     
   }

这是最简单形式的shell,函数调用几乎按照它们所说的执行。

您需要3样东西:

  • 分析输入行中的FOO=foo变量赋值
  • 分析输入行中的$FOO变量引用,替换为值
  • 变量名称和值的存储

如何做后者有无限的可能性。

  • 单个动态字符数组,所有变量存储在一个字符串中,您可以选择一个神奇的字符来分隔条目:FOO=foo#BAR=baz#SPAM=eggs。根据条目数量缩放O(n(
  • 包含变量名和值的成对字符指针的动态数组。缩放O(n(
  • 链表,您可以在其中以排序的方式插入以上对。如果使用二进制搜索进行插入和查找,则缩放O(logn(
  • 上述对的二叉树,如果不平衡,则在O(logn(和O(n(之间缩放
  • 哈希表。刻度O(1(
  • 等等

对于动态数组,我的意思是在插入时总是realloc

如果您想将变量存储在shell中,您应该查看stdlib中的getenv((和setenv(。

http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.htmlhttp://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html

这样就避免了在带有STL的C/C++程序中使用存储。例如,您可以通过设置变量

setenv("variablename", "value", 1);

其中,如果当前变量存在,则1将启用覆盖。因此,在您的示例中,我们将使用

setenv("HELLO", "world", 1);

您还可以使用检索变量的值

char *value = getenv("variablename");

您不需要动态分配值。

注意:这些值将在模拟shell的程序的生命周期中持续存在,之后这些值将不复存在。