操作系统课程作业实现shell.docx
- 文档编号:2979660
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:12
- 大小:131.95KB
操作系统课程作业实现shell.docx
《操作系统课程作业实现shell.docx》由会员分享,可在线阅读,更多相关《操作系统课程作业实现shell.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统课程作业实现shell
实验六简单shell
一、实验目的
通过实现一个简单的shell命令解释器,加深对Windows系统调用的理解,同时了解管道命令的设计实现机制。
二、实验内容
在Windows平台上实现Linux的某些命令:
•展开指定目录:
myls[dir]
•文件查看和连接:
mycat[-n][file1file2……]
•显示文档的开头:
myheadnumberfilename
•排序:
mysort[file1file2……]
•统计可执行文件执行时间:
mytimeprogram1.exe
•复制文件:
mycpab
•自定义出错提示命令:
mysl
分别对应于Linux系统中的lscatheadsorttimecpsl命令,在具体设计实现的时候用法做了简化。
其中,mycat、myhead和mysort为三条管道命令,例如:
mysortfile1.txtfile2.txt|myhead6|mycat-n
三、程序设计与实现
1、程序中使用的结构体
(1)处理输入命令字符串的自定义结构体CMD,定义如下
structCMD{
intcmdposi[10];//记录每条管道命令在命令字符串中是第几个字符串
intlastcmdposi;//最后一条命令是第几条命令
intsubcmdparameter[10];//每条管道命令所带的参数个数
char*subcmd[10][10];//记录命令行中的每一个字符串
}cmd;
对于输入命令:
mysortfile1.txtfile2.txt|myhead6|mycat–n
字符串的位置:
012345678
cmdposi[]:
cmdposi[0]=0cmdposi[1]=4cmdposi[2]=7
subcmd[0]:
mysortfile1.txtfile2.txt
subcmd[][]subcmd[1]:
myhead6
subcmd[2]:
mycat–n
(2)创建进程时,PROCESS_INFORMATION结构返回有关新进程及其主线程的信息。
其结构定义如下:
typedefstruct_PROCESS_INFORMATION{
HANDLEhProcess;//新创建进程的句柄
HANDLEhThread;//新创建进程的主线程的句柄
DWORD dwProcessId;//新创建进程的标识
DWORD dwThreadId;//新创建进程的主线程的标识
}PROCESS_INFORMATION,*LPPROCESS_INFORMATION;
(3)获取系统时间时,使用到SYSTEMTIME结构体,其定义如下:
typedefstruct_SYSTEMTIME{
WORDwYear;//年
WORDwMonth;//月
WORDwDayOfWeek;//星期
WORDwDay;//天
WORDwHour;//小时
WORDwMinute;//分钟
WORDwSecond;//秒
WORDwMilliseconds;//毫秒
}SYSTEMTIME,*PSYSTEMTIME;
(4)在调用函数FindFirstFile、FindNextFile时,将找到的文件的信息存储在win32_FIND_DATA结构体中。
typedefstruct_WIN32_FIND_DATA{
DWORD dwFileAttributes;//文件属性
FILETIMEftCreationTime;//文件创建时间
FILETIMEftLastAccessTime;//文件最后一次访问时间
FILETIMEftLastWriteTime;//文件最后一次修改时间
DWORD nFileSizeHigh;//文件长度高32位
DWORD nFileSizeLow;//文件长度低32位
DWORD dwReserved0;//系统保留
DWORD dwReserved1;//系统保留
TCHAR cFileName[MAX_PATH];//长文件名
TCHAR cAlternateFileName[14];//8.3格式文件名
}WIN32_FIND_DATA,*PWIN32_FIND_DATA,*LPWIN32_FIND_DATA;
(5)FILETIME结构体用来记录文件时间,该结构是表示100纳秒间隔数为64位值从1601年一月1日。
typedefstruct_FILETIME{
DWORDdwLowDateTime;//低32位
DWORDdwHighDateTime;//高32位
}FILETIME,*PFILETIME,*LPFILETIME;
2、使用的主要WindowsAPI
(1)CreateNamedPipe()函数
作用:
创建命名管道
调用格式:
HANDLEWINAPICreateNamedPipe(
LPCTSTRlpName,//管道名称
DWORDdwOpenMode,//管道打开方式
DWORDdwPipeMode,//管道数据组织方式
DWORDnMaxInstances,//管道最大实例量
DWORDnOutBufferSize,//输出缓冲区长度
DWORDnInBufferSize,//输入缓冲区长度
DWORDnDefaultTimeOut,//默认等待时间
LPSECURITY_ATTRIBUTESlpSecurityAttributes//安全属性
);
说明:
调用成功返回管道的句柄,失败返回无效句柄值。
(2)ConnectNamedPipe()函数
作用:
管道创建者与客户进行连接
调用格式:
BOOLWINAPIConnectNamedPipe(
HANDLEhNamedPipe,//命名管道的句柄
LPOVERLAPPEDlpOverlapped//重叠属性
);
说明:
如果lpOverlapped为NULL,那么,若管道已经连接,就返回TRUE,若发生错误,或者管道已经连接,就返回0;如果lpOverlapped有效,就返回零。
(3)WaitNamedPipe()函数
作用:
客户等候与管道创建者建立连接
调用格式:
BOOLWINAPIWaitNamedPipe(
LPCTSTRlpNamedPipeName,//将要连接的管道名称
DWORDnTimeOut//等待时间,以秒为单位
);
说明:
当管道创建者已调用ConnectNamePipe()函数等待与一个客户连接时,该函数成功返回非0,如果失败,或者管道不存在,则返回0。
(4)DisconnectNamedPipe()函数
作用:
管道创建者断开与一个客户连接的命名管道
调用格式:
BOOLWINAPIDisconnectNamedPipe(_In_HANDLEhNamedPipe);
说明:
hNamedPipe为要断开管道的句柄,非0表示成功,0表示失败。
(5)其他的一些API已经在之前的四个实验中详细介绍过,故在此不做赘述。
有CreateProcess()、WaitForSingleObject()、GetSystemTime()、FindFirstFile()、FindNextFile()、CreateFile()、ReadFile()、WriteFile()、GetFileTime()、SetFileTime()、CreateDirectory()等。
四、实验结果及分析
1、实验结果
图一双管道命令
如上图一所示,首先显示file1.txt和file2.txt的内容,myhead命令取前3行输出,mysort命令则是将那3行内容排序后再输出,接着mycat命令最后加上行标再次输出。
图二单管道命令
如上图二所示,首先显示file1.txt和file2.txt的内容,mysort命令将其排序后输出,接着myhead命令取其前3行输出。
图三mytime命令、myls命令
如上图三所示,mytime命令可以计算可执行程序的执行时间,myls命令可以展开指定目录,并显示文件名称、创建时间、修改时间和文件大小。
图四mycp命令
如上图四所示,mycp命令其实就是实验五的任务,在将其收录进我们shell中。
图五mysl命令
如上图五所示,在Linux系统中,ls命令是很常用的,所以程序员一旦不小心敲错了,误写成sl也是情有可原的,这时Linux的terminal会显示一辆跑动的小火车,以此提示程序员。
上述mysl命令的设计也是基于此,这也使得我们的shell变得生动有趣。
2、实验分析
(1)UNIX系统进程之间的通信方式简介以及对比
管道通信:
管道通信允许进程之间按照FIFO方式进行传输数据,一些进程用write命令向管道写入数据,另一些进程用read命令从管道中读数据,且彼此之间同步执行,管道通信是进程使用文件系统中文件进行的,只要通信的双方基本同步,可认为这个文件是无限大的。
无名管道是一个临时文件,当文件被关闭后,文件就不复存在了,它是提供给同族进程之间使用的通信办法。
有名管道则是实现了无家族关系进程之间的通信,任何知道管道名字的进程都可以打开使用,有名管道文件一旦被创建后,磁盘上有一个对应的目录项和索引节点,它与普通文件类似,是通过路径名存取的,只要这种文件不显示删除,它就永远存在,只是文件长度为零。
信号量:
信号量机制的功能是比较强的,它提供了信号量集合。
这种机制是通过P、V操作原语实现的,每次只进行单位数据的交互,通信效率比较低。
消息缓冲&共享内存:
采用消息缓冲和共享内存区是,进程之间可以进行大批数据的交互。
其中,信号量、消息缓冲和共享内存区都属于UNIX系统V的交互进程通信使用的资源,又成IPC资源。
IPC属鸡的数据结构在进程之间请求IPC资源(信号量、消息队列和共享内存区)
(2)Windows对于管道通信的设计机制简介
Windows最大的特点是建立一个简单的客户机/服务器程序设计体系,在这个体系结构中,在客户机与服务器之间,数据既可以单向传递,也可双向流动。
对命令管道服务器和客户机来说,两者的区别在于:
服务器是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。
对一个客户机应用来说,它只能同一个现成的命名管道服务器建立连接。
在客户机应用和服务器应用之间,一旦建立好连接,两个进程都能使用标准的Win32函数,在管道上进行数据的读取与写入。
(3)客户与服务器(管道创建者)之间使用管道通信的步骤:
a.建立连接,服务端通过函数CreateNamedPipe()创建一个命名管道的示例并返回用于今后操作的句柄。
客户端通过调用WaitNamedPipe()使服务进程等待来自客户的示例连接,如果在超时值变为0之前,有一个管道可以为连接使用,则WaitNamePipe()将返回TRUE,并通过CreateFile()来呼叫服务端的连接。
此时服务端将接受客户端的连接请求,成功建立连接,服务端ConnectNamedPipe()返回TRUE,客户端CreateFile()将返回一指向管道文件的句柄。
b.通信实现,连接建立之后,客户端与服务器使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程 作业 实现 shell