shell的简单实现

实验名称:

shell的简单实现

实验原理:

操作系统控制整个硬件与管理系统的活动监测,它不能被用户随意操作,若用户使用不当,可能会造成整个系统崩溃。但我们总是需要让用户操作系统的,这样就有了在操作系统上发展应用程序。用户可以通过应用程序来指挥内核,让内核来完成任务。在整个操作系统中,应用程序在最外层,就如同鸡蛋的外壳一样,这就是shell的由来。

在实现过程中,首先解析用户提交的命令行,通过fork()系统调用产生一进程,调用execvp()函数来完成命令所要求的操作。使用信号(signals)来通知进程事件的发生,并调用信号处理函数来完成处理工作。

实验目的:

学习如何编写一个Unix Shell程序,使得有机会了解如何创建子进程来执行一项专门的工作以及父进程如何继续进行子进程的工作。熟悉进程概念,了解fork,execve,wait等系统调用。本实验的目的主要在于学会如何在Unix系统下创建进程和管理进程。

编写一个C语言程序作为Linux内核的Shell命令行解释程序,实现以下功能:

(1)解析用户提交的命令行;按照环境变量搜索目录系统;执行命令。

(2)提供ls、mkdir  rmdir、pwd、ps等内部命令。

(3)提供历史查询功能。如用户按下Ctr1+C,信号处理器将输出最近的10个命令列表。

(1) setup()函数读取用户的下一条命令(最多80个字符),然后将之分析为独立的标记,这些标记被用来填充命令的参数向量(如果将要在后台运行命令,它将以“&”结尾,setup()将会更新参数background,以使main()函数相应地执行)。当用户按快捷键Ctrl+D后,setup()调用exit(),此程序将被终止。

main()函数打印提示符COMMAND-> ,然后调用setup() ,它等待用户输入命令。用户输入命令的内容被装入一个args 数组。例如,如果用户在COMMAND-> 提示符处输入ls -1 , args[0]等同于字符串ls 和args[1 ]被设置为字符串 –l  (这里的字符串指的是以0结束的C字符串变量)。

(2) 创建子进程

修改main()函数,以使从setup()返回时,创建一个子进程,并执行用户的命令。如前面所指出的,setup()函数用用户指定命令装载args 数组的内容,args 数组将被传递给execvp()函数,该函数具有如下接口:

execvp(char *command, char *params[]);

其中command表示要执行的命令,params保存命令的参数。对于该项目,execvp()函数应作为execvp(args[0],args)来调用;需要保证检测background的值,以决定父进程是否需要等待子进程退出。

信号处理函数应在main()之前声明,并且由于控制可在任意点传递给该函数,没有参数可以传递给它。因此,在程序中,它所访问的任意数据必须定义为全局,即在源文件的顶部、函数声明之前。在从信号处理函数返回之前,它应重发指令提示。

如果用户按下快捷键Ctr1+C, ,信号处理器将输出最近的10 个命令列表。根据该列表,用户通过输入"rx" 可以运行之前10 个命令中的任何一个,其中"x" 为该命令的第一个字母。如果有多个命令以"x" 开头,则执行最近的一个。同样,用户可以通过仅输入"r"来再次运行最近的命令。可以假定只有一个空格来将"r" 和第一个字母分开,并且该字母后面跟着”\n” 。而且,如果希望执行最近的命令,单独的"r" 将紧跟\n。

实验过程:

  home下新建一个文件夹名为test,在该文件夹下新建一个名为a.txt的文本文档。

 

第一条命令:ls /usr/srcs,列出该目录下的文件名

第二条命令:mkdir -p /usr/src/wang

usr/src下创建一个名为wang的文件夹



第三条命令:rmdir /usr/src/wang

删除该路径下的文件wang


 第四条命令:pwd 查看当前目录

第五条命令:ps -a 查看进程

Ctrl+c

列出最近的命令(最多十条)

r m\n:

执行mkdir -p /usr/src/wang


Ctrl+d结束

注:实验代码已上传,如有需要,可直接下载(点击此超链接)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值