23

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

我知道我将不得不使用执行器、叉子和管道,但无法开始。

4

3 回答 3

14

所有的 unix shell 都是开源的——所以一个好的开始可能是阅读代码。

如果您正在寻找有关该主题的良好入门文章,请尝试从 Linux Gazette编写您自己的 Shell 。

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

于 2009-09-30T18:55:35.527 回答
8

你的主循环是:

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

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

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

您不需要使用任何线程。

于 2009-09-30T19:03:09.187 回答
4

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

于 2009-09-30T22:52:08.270 回答