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

我是一个新手处理和线程pipe理。 我的shell应该理解PATH环境variables。 它可以被设置和修改。 它以两种方式运行:交互式和批处理模式。 壳牌能够承担多个工作,比如ls; ps; wc文件; cal。 我也想让信号弄脏信号。 所以我应该处理^ K,^ c。

我知道我将不得不使用高pipe,叉子和pipe道,但不能上手。

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

如果您正在寻找一篇关于这个主题的优秀文章,请尝试从Linux公报中编写自己的Shell 。

另一个好的起点是看看mini-shell的源代码,只是因为它是最小的一个让你头脑发热。

你的主循环是:

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

为了解析命令,有两个常见的选择。 编写递归下降解析器或使用yacc(1)生成一个。 用yacc打开一个初始的解析器会容易yacc ,但是你完全可能会停下来调试它,而且它真的希望没有上下文。 我喜欢递归下降,但世界上其他人更喜欢使用yacc。 (技术上来说, bison 。)如果外壳真的很简单,像一个作业外壳,YACC可能是矫枉过正。

为了做词法分析,你也可以自己编辑或使用flex。

你将不需要使用任何线程。

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

  • W Richard Stevens,Stephen A Rago 在Unix环境下的高级编程,3rd Edn

  • Marc J Rochkind 高级Unix编程,第二版