我是进程和线程管理的新手。我的 Shell 应该了解PATH
环境变量。可以设置和修改。它以两种方式运行 - 交互式和批处理模式。Shell 能够胜任一项以上的工作,例如 ls;ps;wc file;cal。我也想弄脏信号。所以我也应该处理 ^K , ^c 。
我知道我将不得不使用执行器、叉子和管道,但无法开始。
我是进程和线程管理的新手。我的 Shell 应该了解PATH
环境变量。可以设置和修改。它以两种方式运行 - 交互式和批处理模式。Shell 能够胜任一项以上的工作,例如 ls;ps;wc file;cal。我也想弄脏信号。所以我也应该处理 ^K , ^c 。
我知道我将不得不使用执行器、叉子和管道,但无法开始。
所有的 unix shell 都是开源的——所以一个好的开始可能是阅读代码。
如果您正在寻找有关该主题的良好入门文章,请尝试从 Linux Gazette编写您自己的 Shell 。
另一个很好的起点是看一下mini-shell的源代码,因为它是最小的之一。
你的主循环是:
fgets(3)
用于简单的外壳,readline(3)
用于花哨的外壳)要解析命令,有两种常见的选择。编写一个递归下降解析器或用于yacc(1)
生成一个。使用 敲击初始解析器要容易得多yacc
,但是您可能会完全陷入调试它的困境,并且它确实希望是无上下文的。我更喜欢递归下降,但世界上几乎所有其他人都更喜欢使用 yacc。(从技术上讲,bison
。)如果 shell 真的很简单,就像一个家庭作业 shell,那么 yacc 可能会过大。
要进行词法分析,您也可以自己滚动或使用 flex。
您不需要使用任何线程。
许多描述主要系统调用的 Unix 书籍也实现了一个 shell 来说明如何以及为什么可以使用各种调用。史蒂文斯和罗奇金德就是这样的两本书:
W Richard Stevens,Stephen A Rago Unix 环境中的高级编程,第三版
Marc J Rochkind 高级 Unix 编程,第二版