我想创建一个程序,以类似于Linux上ip
的方式接受命令。例如,我希望拥有show interface options
的完整命令,但如果用户不与其他命令冲突,则可以只输入show in options
或甚至只输入s i o
。
我有一些关于如何解决这个问题的想法,我想在C中这样做。所以问题是在Linux / UNIX系统之间保持尽可能可移植性的同时,这是一个很好的方法。
我的第一个想法是有一个链表。每个列表项指向字符串数组中的下一个命令,最后一个命令具有函数调用的地址(请原谅我的草率伪代码)。
header.h
typedef int8_t (__cdecl *proc_stub)(void *data, uint16_t len);
typedef struct s_proc_stub
{
char command[16];
proc_stub proc;
struct s_proc_stub *next;
};
struct s_proc_stub proc_list[] =
{
{ "cmd", CommandFunction, ... },
{ "set", SetFunction, ... },
...
};
我觉得这可能会导致额外的CPU和RAM利用率下降。它也可能容易出错,从而导致漏洞。这个过程将面向互联网,所以我想确保代码的安全性。
我的下一个想法是使用strtok()并对每个标记执行strnicmp()。另一种方法是使用指针算法更快地模拟strtok()而无需修改缓冲区。我觉得strtok是最直接的方法,也是最不容易出错的方法,但我想说我记得strtok()与其他两种方法相比有一些额外的开销。
目标平台是Raspberry Pi,它只有大约2GB的RAM可供使用。驱动器通常非常小,CPU可以,但不适合繁重的处理。我预计这些进程会受到命令处理的严重负担,因此我希望找到最小化RAM和CPU使用量的理想解决方案。我很想听到一些我不知道的方法! :)
答案 0 :(得分:1)
我不知道这是否有用,但如果您不想重新发明轮子,请查看GNU readline,GNU / Linux中用于此类内容的库
答案 1 :(得分:1)
我认为trie(前缀树)数据结构是合适的,https://en.wikipedia.org/wiki/Trie;特别是,最小化内存量,人们可能更喜欢紧凑的前缀树,(基数树)。来自,https://en.wikipedia.org/wiki/Radix_tree:
在一个特里,所有比较都需要恒定的时间,但需要进行m次比较才能查找长度为m的字符串。基数树可以用较少的比较执行这些操作,并且需要更少的节点。