杨泽彬的神秘商店

博客园 首页 新随笔 联系 订阅 管理

因为一些原因接触到了在操作系统层外的应用层命令行解释器
于是对命令行解释器产生了兴趣
搜索发现如果是仿制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语言读取字符串。

posted on 2022-08-25 16:01  快乐过了阈值  阅读(95)  评论(0)    收藏  举报