如何在C中实现自己的基本unix shell?

时间:2009-09-30 18:52:48

标签: c unix shell command-line interpreter

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

我知道我必须使用高管,叉子和管道,但是无法上手。

3 个答案:

答案 0 :(得分:14)

所有unix shell都是开源的 - 所以开始的好地方可能是阅读代码。

如果你正在寻找关于这个主题的好文章,请试试Linux公报中的Writing Your Own Shell

另一个好的起点是看一下mini-shell的源代码,因为它是最小的一个,可以让你满意。

答案 1 :(得分:8)

您的主循环是:

  • 读一行(使用fgets(3)表示一个简单的shell,readline(3)表示一个简单的shell)
  • 解析命令
  • fork并执行管道

要解析命令,有两种常见的选择。编写递归下降解析器或使用yacc(1)生成一个。使用yacc敲出初始解析器要容易得多,但是你完全可以调试它并且它真的想要无上下文。我更喜欢递归下降,但世界上其他所有人都喜欢使用yacc。 (从技术上讲,bison。)如果shell非常简单,就像一个作业shell,yacc可能有点过分。

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

您不需要使用任何线程。

答案 2 :(得分:4)

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