因为一些原因接触到了在操作系统层外的应用层命令行解释器
于是对命令行解释器产生了兴趣
搜索发现如果是仿制Linux命令行的简易命令行解释器难度并不高
参考网址:[]:https://blog.csdn.net/chenxiyuehh/article/details/90404210
首先参照他的代码确实可以实现了很简陋的命令行处理
不过调用的仍然是其Linux本身的shell 指令
如果是应用层的app_cli 则需要自己实现各种指令 如ls 需要对它进行比较(这相当于是shell命令的底层实现原理)
受困于其中的进程切换的各种逻辑:
这篇文章很好地帮助了我:[]:https://zhuanlan.zhihu.com/p/529691890
我认为嵌入式的Linux中线程也同样适用。
app_cli 中 的command 应该不是调用的系统调用,而是参照Linux的shell命令解析写的(shell指令是一个个在Linux中的小程序)。
例如我所能想到的:
设计一个app_cli的对象(结构体),以这个结构体为目标建立一个系统或用户维护的链表或者是队列
在初始化的时候注册(将其添加进链表/队列当中),即从头构建指令链表。
解析指令采用遍历链表中的对象中的字串串成员进行匹配,如有则返回其地址或者函数指针..
然后执行相关操作,这部分解析操作可以交给一个新线程执行。
而父线程则执行其他操作(具体可以做些啥没想明白)也许读取新的指令?
因此我对应用层的app_cli设计理念以及实现相当感兴趣
随记:
后面我想着用c++写一遍这个Linux shell 指令的解释器。
不成想,遇到了很多有趣的问题。后续复制粘贴添加到c++内存那边。
首先是读取指令的时候
程序使用的是C语言的char 数组 读取的函数是fgets(char*,长度,stdin)...
问题出现在它的最后并没有自动补0 导致字串不成,在后面的解析失败。
其次是getline(cin,s)这个函数不能传入char 数组(char*)
因此我产生了用c++实现这个解释器的想法,而且fgets这个函数我没怎么用过。
新问题诞生了,得到了string,可是execvp这类系统系统调用并不支持c++
于是我用string.c_str 尝试使用strcpy()将其复制过去,却发生了运行时段错误(内存错误)
原因是char* p; 并没有申请足够的地址空间, 要么初始化char p[1024],要么向系统申请内存。
至此,问题仍然没有解决,因为这不能满足execvp的参数要求。还是老老实实从一开始乖乖地用c语言读取字符串。
本文来自博客园,作者:快乐过了阈值,转载请注明原文链接:https://www.cnblogs.com/black-worrior-2000/p/16624578.html
墨愁前路无知己,天下谁人不识君。
浙公网安备 33010602011771号