在c ++中创建shell,尝试创建shell变量

时间:2015-05-18 05:58:41

标签: c++ c shell variables unix

所以我有一个相对简单的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,函数调用几乎就是他们所说的。

2 个答案:

答案 0 :(得分:2)

你需要3件事:

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

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

  • 单个动态字符数组,所有变量都存储在一个字符串中,并使用您选择的魔术字符分隔条目:FOO=foo#BAR=baz#SPAM=eggs。使用条目数来缩放O(n)。
  • 包含变量名称和值的char指针对的动态数组。 Scales O(n)。
  • 链接列表,您可以按排序方式在上面插入对。如果使用二进制搜索进行插入和查找,则缩放O(log n)。
  • 上述对的二叉树,如果不平衡,则在O(log n)和O(n)之间缩放。
  • 哈希表。 Scales O(1)。
  • Etc等等。

使用动态数组,我的意思是你在插入时总是realloc

答案 1 :(得分:1)

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

http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html http://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的程序的生命周期内持续存在,之后它们不再存在。