操作系统课程设计
课程设计报告
题目: 小型命令处理器 smallshell
所在学院: 信息工程学院
班
学
姓
级: 计科 1201
号:
名:
指导教师: 徐向英
2015 年 1 月 1 日
操作系统课程设计
目录
一、课程设计目标...................................................................... 3
二、课题内容.............................................................................. 3
三、设计思路.............................................................................. 3
四、源代码.................................................................................. 6
五、运行与测试........................................................................ 10
六、心得体会............................................................................ 13
2 / 13
操作系统课程设计
一、课程设计目标
设计并实现一个简单的命令处理程序,名字为 smallshell。要求具备以下基本
功能:
1.支持交互式的用户界面
2.支持内置命令:cd,exit,设置搜索路径 path 等。
3.支持可执行文件的运行
4.支持输入输出重定向功能
5.支持管道功能
二、课题内容
编写一个小型命令处理器 smallshell。
三、设计思路
交互界面
命令解析
可执行文件
内部命令
创建子进程执行
I/O 重定向
创建管道
smallshell 总体结构
1.交互式用户界面
在 smallshell 中,显示如下格式的交互界面:
[sername@servername:pathname]$
2.支持内置命令: exit,设置搜索路径 path 等
如果用户输入内置命令,smallshell 根据命令名及参数进行相应处理。下面
以搜索路径命令和改变路径命令为例,分别说明其实现所涉及的函数。
(1) 搜索路径命令
该命令用于设置搜索路径。可以调用函数 getcwd(b, sizeof(b));,实现对搜索
路径的更新。
int MyPwd()//显示当前目录
3 / 13
操作系统课程设计
{
char b[255];
getcwd(b, sizeof(b)); //将当前的工作目录绝对路径复制到参数 b 中所指的
内存空间
cout<>path;
if( chdir(path) == 0 )
printf("修改工作路径成功\n");
getcwd(path,_MAX_PATH);
printf("当前工作目录:\n%s\n",path);
else
perror("修改工作路径失败");
return 0;
{
}
{
}
}
3.支持可执行文件的运行
如果用户输入的不是内置命令,而是一个可执行文件名,则需要在设置的
路径中搜索该命令,并在此环境中执行。可以通过 CreateProcess()函数先对该
命令进行测试:
具体实现的代码如下:
int MyExe()
//可执行文件
{STARTUPINFO si;
memset(&si,0,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
4 / 13
操作系统课程设计
if(!CreateProcess(TEXT(".\\Debug\\1.exe"),NULL,NULL,NULL,FALSE,0,NULL,
NULL,&si,&pi))
{
cout<<"Create Fail!"<
操作系统课程设计
int output()
{
FILE *fp;
char ch;
if((fp=fopen("a.txt","r"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
while((ch=fgetc(fp))!=EOF)
putchar(ch);
printf("\0");
fclose(fp);
return 0;
}
5.支持管道功能
shell 中的管道功能是将一个命令的输出作为另一个命令的输入。
四、源代码
//在 Windows 下运行
#include
#include
#include
#include
#include
#include
using namespace std;
int init()//初始化
{
cout<<"*
cout<<"*
cout<<"*
cout<<"*
*"<*"<>path;
if( chdir(path) == 0 )
printf("修改工作路径成功\n");
getcwd(path,_MAX_PATH);
printf("当前工作目录:\n%s\n",path);
else
perror("修改工作路径失败");
{
}
{
}
return 0;
}
int MyExe()
{STARTUPINFO si;
memset(&si,0,sizeof(STARTUPINFO));
//可执行文件
7 / 13
操作系统课程设计
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
if(!CreateProcess(TEXT(".\\Debug\\1.exe"),NULL,NULL,NULL,FALSE,0,NULL,
NULL,&si,&pi))
{
cout<<"Create Fail!"<