Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用C实现自己的基本unix shell?_C_Unix_Shell_Command Line_Interpreter - Fatal编程技术网

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

如何用C实现自己的基本unix shell?,c,unix,shell,command-line,interpreter,C,Unix,Shell,Command Line,Interpreter,我是处理和线程管理的新手。我的Shell应该理解PATH环境变量。它可以设置和修改。它以两种方式运行-交互和批处理模式。壳牌能够像ls一样承担多个工作;附言wc文件;卡尔。我也想在信号上弄脏我的手。所以我也应该处理^K,^c 我知道我将不得不使用exec、fork和pipes,但就是不能开始使用。所有unix shell都是开源的,因此阅读代码可能是一个好的开始 如果你想找一篇关于这个主题的入门文章,可以从《Linux公报》上找到 另一个很好的起点是查看的源代码,因为它是让您头脑清醒的最小代码之

我是处理和线程管理的新手。我的Shell应该理解
PATH
环境变量。它可以设置和修改。它以两种方式运行-交互和批处理模式。壳牌能够像ls一样承担多个工作;附言wc文件;卡尔。我也想在信号上弄脏我的手。所以我也应该处理^K,^c


我知道我将不得不使用exec、fork和pipes,但就是不能开始使用。

所有unix shell都是开源的,因此阅读代码可能是一个好的开始

如果你想找一篇关于这个主题的入门文章,可以从《Linux公报》上找到

另一个很好的起点是查看的源代码,因为它是让您头脑清醒的最小代码之一。

您的主要循环是:

  • 读一行(使用
    fgets(3)
    读一个简单的shell,使用
    readline(3)
    读一个漂亮的shell)
  • 解析命令
  • 分叉并执行管道
要解析该命令,有两种常见的选择。编写递归下降解析器或使用
yacc(1)
生成一个。使用
yacc
创建初始解析器要容易得多,但调试它时可能会遇到困难,而且它确实希望与上下文无关。我更喜欢递归下降,但世界上几乎所有其他人都喜欢使用yacc。(从技术上讲,
野牛
)如果外壳真的很简单,比如家庭作业外壳,那么yacc可能是杀伤力过大

要进行词法分析,您还可以自己使用或使用flex


您不需要使用任何线程。

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

  • 理查德·史蒂文斯,斯蒂芬·拉戈

  • 马克罗金德


这是一个家庭作业问题吗?如果是这样的话,你应该给它贴上合适的标签。我建议在任何情况下都要使用
readline()
——只要你使用这个shell,你的生活就会变得无限轻松。但是+1表示陷入yacc/野牛的困境。很好的工具,但很难简化。如果你只想从YoyurShell执行程序,那么你不需要解析器和词法分析器。。。但是,如果您确实想做“其他”事情,那么我建议您使用flex+yacc。。。不要自己滚,我明白了。但我也想在信号上弄脏我的手。所以我也应该处理^K,^c。