Chinaunix首页 | 论坛 | 博客
  • 博客访问: 819875
  • 博文数量: 117
  • 博客积分: 2583
  • 博客等级: 少校
  • 技术积分: 1953
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-06 22:58
个人简介

Coder

文章分类
文章存档

2013年(1)

2012年(10)

2011年(12)

2010年(77)

2009年(13)

2008年(4)

分类: C/C++

2009-10-22 20:11:17

    开始要试着编写一个自己的简单的Shell了,也算是练练手,熟悉一下UNIX编程环境,熟悉一下UNIX的系统调用的行为,还有标准C lib里面一些函数的行为。这个小小的project来自于《操作系统:精髓与设计原理》上的一道作业题。以下内容绝大部分也是摘自这道作业题。呵呵。Shell或者称之为命令行解释器的这么一个东东,是操作系统的用户接口,以使用户可以使用系统提供的资源,可以管理和控制自己的计算机。和我们日常使用的那些出色的shell相比,有一点算是一个进步吧,就是提供了更高级数的目录回溯功能,使用cd -命令。project名称还按照书上给的起为myshell,它具有如下属性:
1.这个shell必须支持一下内部命令:
注1:所谓内部命令,即是实现为shell内部的一个函数的命令,而外部命令就是shell之外的独立的命令,shell读入外部命令,然后调用exec执行。通常情况下,内部命令由于省去了创建进程的开销,而执行的更加高效。
    i.cd ——把当前默认目录改变为。如果没 有参数,则显示当前目录。如果该目录不存在,会出现合适的错误信息。这个命令也可以改变PWD环境变量。支持参数-,即返回到上一次所在的目录。
   ii.clr——清屏。
  iii.dir ——列出目录的内容。
   iv.environ——列出所有的环境变量。
    v.echo ——在屏幕上显示并换行(多个空格和制表符可能被缩减为一个空格)。
   vi.help——显示用户手册,并且使用more命令过滤。
  vii.pause——停止shell操作直到按下回车键。
 viii.history——显示最近执行的命令。
   ix.quit——推出shell
    x.shell的环境变量应该包括shell=/myshell,其中/myshell是可执行程序shell的完整路径(不是目录下的硬链接路径,而它执行的路径)。

2.其他命令行输入被解释为程序调用,shell创建并执行这个程序,并作为自己的子进程。程序的执行环境变量包括以下条目:
  parent=/myshell,其中/myshell已经在1.ix中讲述过。

3.shell必须能从文件中提取命令行输入,例如shell使用一下命令行被调用:
programname arg1 arg2 < inputfile > outfile
这个批处理文件应该包含一组命令集,当到达文件尾时shell退出。很明显,如果shell被调用时没有使用参数,他会在屏幕上显示提示符请求用户输入。

4.shell必须支持I/O重定向,stdin和stdout,或者其中之一,例如命令行为
programname arg1 arg2 < inputfile > outputfile
使用arg1arg2执行程序programname,输入文件流被替换为inputfile,输入文件流被替换为outputfile
stdout重定向应该支持一下内部命令:dir,environ,echo&help
使用输入重定向时,如果重定向字符时>,则创建输入文件,如果存在则覆盖之;如果重定向字符为>>,也会创建输出文件,如果存在则添加到文件尾。

5.shell必须支持后台程序执行。如果在命令行后添加&字符,在加载完程序后需要立刻返回命令行提示符。

6.命令行提示符必须包含当前路径。
提示:可以假定所有命令行参数(包括重定向字符<>>>和后台执行字符&)和其他命令行参数用空白空间分开。空白空间可以为一个或多个空格或者制表符(见上面4的命令行)。

项目要求

1.设计一个简单的命令行shell,满足上面的要求并且在指定的UNIX平台下执行。

2.写一个关于如何使用shell的简单用户手册,用户手册应该包含足够的细节以方便UNIX初学者使用。例如,应该解释I/O重定向、程序环境和后台程序执行。用户手册必须命名为readme,必须是一个标准文本编辑器可以打开的简单文本文档。
举一个描述的类型和深度的例子,应该查看一下cshtcsh的在线帮助(man cshman tcsh)。这两个shell显然比我们的shell有更多的功能,用户手册没必要做得这么大。不要包括编译指示——文件列表和源码,我们可以从其他文件中找出来。这应该是操作员手册而非程序员手册。

3.源码必须有很详细的注释,并且要有很好的组织结构以便别人阅读和维护。结构和注释好的程序更加易于理解。

4.项目全部内容为源码文件,包括、makefile(全部小写)和readme(全部小写)文件。

5.makefile(全部小写)必须产生二进制文件myshell(全部小写)。一个makefile的例子为

#Joe Citizen, s1234567-Operating Systems Project 1
#CompLab1/01 tutor: Fred Bloggs
myshell:myshell.c utility.c myshell.h
gcc -Wall myshell.c utility.c -o myshell

在命令行提示符下键入make就会产生myshell程序。
提示:上面makefile的第4行必须一制表符开始。

6.根据上面提供的实例,目录应该包含以下文件:
makefile,myshell.c,utility.c,myshell.h,readme
所有的文件会在同一个目录下,所以不要在makefile中包含路径。makefile中应该包含编译程序所需的依赖关系,如果包含了库文件,makefile也应会编译这个库文件。

阅读(2996) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~