如何在 C 中实现我自己的基本 unix shell?
Posted
技术标签:
【中文标题】如何在 C 中实现我自己的基本 unix shell?【英文标题】:How can I implement my own basic unix shell in C? 【发布时间】:2010-12-02 18:27:08 【问题描述】:我是进程和线程管理的新手。我的 Shell 应该理解 PATH
环境变量。可以设置和修改。它以两种方式运行 - 交互式和批处理模式。 Shell 能够胜任一项以上的工作,例如 ls;ps;wc file;cal。我也想弄脏信号。所以我也应该处理 ^K , ^c 。
我知道我将不得不使用 exec、fork 和管道,但就是无法开始。
【问题讨论】:
这是一道作业题吗?如果是这样,您应该适当地标记它。 【参考方案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 就是这样的两本书:
W 理查德·史蒂文斯、斯蒂芬·A·拉戈 Advanced Programming in the Unix Environment, 3rd Edn
马克·J·罗奇金德 Advanced Unix Programming, 2nd Edn
【讨论】:
【参考方案3】:所有的 unix shell 都是开源的 - 所以最好从阅读代码开始。
如果您正在寻找有关该主题的优秀入门文章,请尝试 Linux Gazette 中的Writing Your Own Shell。
另一个很好的起点是查看mini-shell 的源代码,因为它是最小的之一。
【讨论】:
以上是关于如何在 C 中实现我自己的基本 unix shell?的主要内容,如果未能解决你的问题,请参考以下文章