【问题标题】:Emulating a linux/bash shell in C++?在 C++ 中模拟 linux/bash shell?
【发布时间】:2012-09-15 04:51:33
【问题描述】:

所以我基本上在这里寻找最简单的方法,因此我想要的是一个游戏内 linux-shell(将使用 opengl 和 sfml 呈现),它将模拟/模拟一个 linux 盒子。 它不需要那么花哨,我优先考虑的是基础知识(ls、grep、cat、echo..)、某种编辑器(vim/nano-like),以及游戏逻辑可以与 /开发,/等等等等。

我曾考虑过对环境进行 chroot,但我发现这样做的问题多于解决方案。还想过是否有某种流行的用 C++ 编写的可以与主机代码紧密集成的 linux 模拟器,这是一个远景,我还没有找到任何东西。

非常感谢任何帮助我走上正确道路的人!

PS。最终产品将是跨平台的(至少对于win / linux)

【问题讨论】:

    标签: c++ linux bash shell terminal


    【解决方案1】:

    我会这样做。

    我会将目录结构实现为节点树(有点像链表,但是,每个父节点可以有任意数量的子节点)。然后,如果您想运行以下命令(我知道,这些不是 Linux 中的所有命令,但这仍然可以让您很好地理解我在说什么),它们的行为应该是这样的:

    • ls - 简单查看当前节点并列出所有子节点

    • ls -R - 查看当前节点并递归列出所有子节点(参见wikipedia's tree traversal page)

    • cd /some/path - 根据/s 拆分/some/path,然后尝试将当前工作目录(这应该作为指向节点的指针实现)更改为用户指定的路径。如果路径是绝对路径(即以 / 开头,则它在目录结构中的成员身份应该很容易通过尝试从根节点定位来验证。

    这让我想到了另一点。由于您的结构是一棵节点树,您应该有两种类型的节点:代表文件的节点和代表目录的节点。目录可能有孩子,文件可能没有。此外,文件节点可能有一组关联的数据(可能是一个字符串),这些数据可能是文件的内容(因为您希望能够编辑文件)。

    • rm somefile - 如果子节点存在于当前工作目录中,则简单地取消它。

    • mkdir somedir - 如果 somedir 尚不存在,则将新目录节点附加到当前工作中。

    • rmdir somedir - 从当前工作目录中删除名为 somedir 的目录节点(如果它没有子节点)。

    现在上面只真正讨论了目录结构,我可以继续列出命令以及它们将如何实现,但我认为你已经明白了这一点。所以,我会谈谈你列出的其他命令(grep、cat、echo、vim/nano)。

    • 就实现 grep 而言,使用我上面的结构,制作一个非常原始的实现会相当容易。您只需遍历文件的每一行(在这种情况下,这将是与文件节点关联的数据)并在每一行上进行字符串比较,打印匹配项。如果您允许使用正则表达式,那么我无法帮助您,我建议您查看c++ regular expressions library。但是,还有其他选择。grep 是开源的,因此您可以使用它的源代码,或者简单地阅读它并了解它是如何实现的。 Grep's source code.

    • 使用上述树形结构“分类”一个或多个文件会很简单。您只需cout 顺序地与文件节点关联的所有数据。而且,像grepcat 一样是 OSS(开源软件)。

    • echo 应该很容易实现。只需打印回它的论点。至少是一种补救形式的回声(虽然我不太确定回声会比这更复杂。

    • 至于实现 vim/nano 或类似的东西。我真的帮不了你。我再次倾向于将您引向他们的源代码(vim,nano)。但是,我意识到这可能不是很有帮助,因为两者都是大型项目。

    【讨论】:

    • PS,我知道我有很多只是使用/阅读上面的源类型 cmets。我相信(和其他人一样)阅读编码良好的项目(以及就此而言编码不佳的项目)的源代码是作为程序员学习和进步的最佳方式之一。
    • 我已经考虑过这一点,但这需要大量的工作。我同意,作为程序员进步的最好方法是研究其他人的工作,但这是太多的学习/工作;游戏的这一部分并没有足够大的资产让我花那么多时间在它上面工作。此外,我的目标是创建 bash shell 和 linux 系统的真实感觉,让用户根据他对 bash/linux 的真实了解以及他对如何使用某些命令的偏好(想想真的很复杂例如 grep 参数)。
    • 这很好理解。编码愉快,朋友。
    • 你可以运行一些廉价的虚拟机,例如Qemu,带有迷你 Linux。
    • @BasileStarynkevitch 虽然我刚刚有!当然,您可以在 VM 上使用 DSL linux 安装,然后使用 VBox 或其他工具运行它。
    【解决方案2】:

    您可能对BusyBox 感兴趣,它是一个小型且免费提供的 Linux 命令行许多特性的实现。您应该能够将它嵌入到您的游戏中,而不会有太多麻烦。当然,您还必须分别建模文件系统和 tty 接口。

    【讨论】:

    • 还没想过busybox!也许我可以使用它的源代码来构建我自己的“集成游戏操作系统”并跨平台维护该代码。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2018-10-15
    • 1970-01-01
    • 2015-03-05
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多