如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单页移动 Web 应用程序中实现我自己的历史堆栈?

如何在 GUI 中实现我的 while 循环以使用 Visual Studio 在 C/C++ 中保持按键

如何在 Wordpress 中实现我的自定义登录页面?

链表遍历无限

使用访问者时提升变体转换错误

JWT:如何在密码或用户名错误 Django REST 上实现我的自定义错误消息