gpt4 book ai didi

c++ - 在 C++ 中制作 shell,尝试创建 shell 变量

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:38 25 4
gpt4 key购买 nike

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

最佳答案

你需要三样东西:

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

后者有无穷无尽的可能性。

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

对于动态数组,我的意思是您总是在插入时重新分配整个数组。

关于c++ - 在 C++ 中制作 shell,尝试创建 shell 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com