【问题标题】:How can I implement my own basic unix shell in C?如何在 C 中实现我自己的基本 unix shell?
【发布时间】:2010-12-02 18:27:08
【问题描述】:

我是进程和线程管理的新手。我的 Shell 应该理解 PATH 环境变量。可以设置和修改。它以两种方式运行 - 交互式和批处理模式。 Shell 能够胜任一项以上的工作,例如 ls;ps;wc file;cal。我也想弄脏信号。所以我也应该处理 ^K , ^c 。

我知道我将不得不使用 exec、fork 和管道,但就是无法开始。

【问题讨论】:

  • 这是一道作业题吗?如果是这样,您应该适当地标记它。

标签: c unix shell command-line interpreter


【解决方案1】:

你的主循环是:

  • 读一行(fgets(3) 用于简单的 shell,readline(3) 用于花哨的 shell)
  • 解析命令
  • 分叉并执行管道

要解析命令,有两种常见的选择。编写递归下降解析器或使用yacc(1) 生成一个。使用yacc 敲出一个初始解析器要容易得多,但你可能会完全陷入调试它的困境,它真的希望是无上下文的。我更喜欢递归下降,但世界上几乎所有其他人都更喜欢使用 yacc。 (从技术上讲,bison。)如果 shell 真的很简单,就像一个家庭作业 shell,那么 yacc 可能有点矫枉过正。

要进行词法分析,您也可以自己滚动或使用 flex。

您不需要使用任何线程。

【讨论】:

  • 我建议在任何情况下都使用readline() - 只要您必须使用上述外壳,它就会让您的生活变得无限轻松。但是 +1 是因为陷入 yacc/bison 的困境。很好的工具,但要简化是一项艰巨的任务。
  • 如果您只想从 yoyur shell 执行程序,那么您不需要解析器和词法分析器......但是如果您确实想做“其他”事情,那么我建议您使用 flex +yacc ... 不要自己滚动
  • 我明白了。但我也想弄脏信号。所以我也应该处理 ^K , ^c 。
【解决方案2】:

许多描述主要系统调用的 Unix 书籍也实现了一个 shell 来说明如何以及为什么可以使用各种调用。 Stevens 和 Rochkind 就是这样的两本书:

【讨论】:

    【解决方案3】:

    所有的 unix shell 都是开源的 - 所以最好从阅读代码开始。

    如果您正在寻找有关该主题的优秀入门文章,请尝试 Linux Gazette 中的Writing Your Own Shell

    另一个很好的起点是查看mini-shell 的源代码,因为它是最小的之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2011-04-25
      • 2015-11-02
      • 2015-01-11
      相关资源
      最近更新 更多