操作系统课程作业实现SHELL

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FILETIME ftCreationTime;//文件创建时间 FILETIME ftLastAccessTime;//文件最后一次访问时间 FILETIME ftLastWriteTime;//文件最后一次修改时间 DWORD DWORD DWORD DWORD TCHAR TCHAR nFileSizeHigh;//文件长度高 32 位 nFileSizeLow;//文件长度低 32 位 dwReserved0;//系统保留 dwReserved1;//系统保留 cFileName[MAX_PATH];//长文件名 cAlternateFileName[14];//8.3 格式文件名
LPSECURITY_ATTRIBUTES lpSecurityAttributes//安全属性 ); 说明:调用成功返回管道的句柄,失败返回无效句柄值。
(2) ConnectNamedPipe()函数 作用:管道创建者与客户进行连接 调用格式: BOOL WINAPI ConnectNamedPipe( HANDLE hNamedPipe,//命名管道的句柄
操作系统课程设计实验报告
实验六 简单 shell
班级: 07111301 学号: 学号: 学号: 学号: 1120131743 1120131767 1120131746 1120131766 姓名: 姓名: 姓名: 姓名: 谈兆年 徐欣廷 杨知水 杜田野
一、实验目的
通过实现一个简单的 shell 命令解释器,加深对 Windows 系统调用的理解,同时 了解管道命令的设计实现机制。
四、实验结果及分析
1、实验结果
图一
双管道命令
如上图一所示,首先显示 file1.txt 和 file2.txt 的内容,myhead 命令取 前 3 行输出,mysort 命令则是将那 3 行内容排序后再输出,接着 mycat 命令最 后加上行标再次输出。
5
操作系统课程设计实验报告
图二 单管道命令 如上图二所示,首先显示 file1.txt 和 file2.txt 的内容,mysort 命令将 其排序后输出,接着 myhead 命令取其前 3 行输出。
2
操作系统课程设计实验报告
WORD wMilliseconds;//毫秒 } SYSTEMTIME, *PSYSTEMTIME;
(4) 在调用函数 FindFirstFile、FindNextFile 时,将找到的文件的信息存储在 win32_FIND_DATA 结构体中。 typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes;//文件属性
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
(3) 获取系统时间时,使用到 SYSTEMTIME 结构体,其定义如下: typedef struct _SYSTEMTIME { WORD wYear;//年 WORD wMonth;//月 WORD wDayOfWeek;//星期 WORD wDay;//天 WORD wHour;//小时 WORD wMinute;//分钟 WORD wSecond;//秒
7
操作系统课程设计实验报告
2、实验分析 (1)UNIX 系统进程之间的通信方式简介以及对比 管道通信: 管道通信允许进程之间按照 FIFO 方式进行传输数据,一些进程用 write 命 令向管道写入数据,另一些进程用 read 命令从管道中读数据,且彼此之间同步 执行,管道通信是进程使用文件系统中文件进行的,只要通信的双方基本同步, 可认为这个文件是无限大的。 无名管道是一个临时文件,当文件被关闭后,文件就不复存在了,它是提供 给同族进程之间使用的通信办法。 有名管道则是实现了无家族关系进程之间的通信,任何知道管道名字的进程 都可以打开使用,有名管道文件一旦被创建后,磁盘上有一个对应的目录项和索 引节点,它与普通文件类似,是通过路径名存取的,只要这种文件不显示删除, 它就永远存在,只是文件长度为零。 信号量: 信号量机制的功能是比较强的,它提供了信号量集合。这种机制是通过 P、V 操作原语实现的,每次只进行单位数据的交互,通信效率比较低。 消息缓冲&共享内存: 采用消息缓冲和共享内存区是,进程之间可以进行大批数据的交互。 其中,信号量、消息缓冲和共享内存区都属于 UNIX 系统 V 的交互进程通信使用 的资源, 又成 IPC 资源。 IPC 属鸡的数据结构在进程之间请求 IPC 资源(信号量、 消息队列和共享内存区)
图五
mysl 命令
如上图五所示,在 Linux 系统中,ls 命令是很常用的,所以程序员一旦不小心 敲错了,误写成 sl 也是情有可原的,这时 Linux 的 terminal 会显示一辆跑动的 小火车,以此提示程序员。上述 mysl 命令的设计也是基于此,这也使得我们的 shell 变得生动有趣。
cmdposi[]:
cmdposi[0]=0
cmdposi[1]=4
cmdposi[2]=7
subcmd[0]: mysort file1.txt file2.txt subcmd[][] subcmd[1]: myhead 6 subcmd[2]: mycat –n
(2) 创建进程时,PROCESS_INFORMATION 结构返回有关新进程及其主线程的信息。 其结构定义如下: typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD DWORD dwProcessId; dwThreadId; //新创建进程的句柄 //新创建进程的主线程的句柄 //新创建进程的标识 //新创建进程的主线程的标识
二、实验内容
在 Windows 平台上实现 Linux 的某些命令: 展开指定目录:myls [dir] 文件查看和连接:mycat [-n] [file1 file2……] 显示文档的开头:myhead number filename 排序:mysort [file1 file2 ……] 统计可执行文件执行时间:mytime program1.exe 复制文件:mycp a b 自定义出错提示命令:mysl head sort time cp sl 命令, 在具体
(4) DisconnectNamedPipe()函数
4
操作系统课程设计实验报告
作用:管道创建者断开与一个客户连接的命名管道 调用格式: BOOL WINAPI DisconnectNamedPipe(_In_ HANDLE hNamedPipe); 说明:hNamedPipe 为要断开管道的句柄,非 0 表示成功,0 表示失败。 (5)其他的一些 API 已经在之前的四个实验中详细介绍过,故在此不做赘述。有 CreateProcess()、 WaitForSingleObject()、 GetSystemTime()、 FindFirstFile()、 FindNextFile()、CreateFile()、ReadFile()、WriteFile()、GetFileTime()、 SetFileTime()、CreateDirectory()等。
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
(5) FILETIME 结构体用来记录文件时间,该结构是表示 100 纳秒间隔数为 64 位 值从 1601 年一月 1 日。 typedef struct _FILETIME { DWORD dwLowDateTime;//低 32 位 DWORD dwHighDateTime;//高 32 位 } FILETIME, *PFILETIME, *LPFILETIME;
8
操作系统课程设计实验报告
(3)客户与服务器(管道创建者)之间使用管道通信的步骤: a.建立连接,服务端通过函数 CreateNamedPipe()创建一个命名管道的示例 并返回用于今后操作的句柄。客户端通过调用 WaitNamedPipe()使服务进程等待 来自客户的示例连接,如果在超时值变为 0 之前,有一个管道可以为连接使用, 则 WaitNamePipe()将返回 TRUE,并通过 CreateFile()来呼叫服务端的连接。此 时服务端将接受客户端的连接请求, 成功建立连接, 服务端 ConnectNamedPipe() 返回 TRUE,客户端 CreateFile()将返回一指向管道文件的句柄。 b.通信实现,连接建立之后,客户端与服务器使用得到的管道文件句柄通过 调用 WriteFile()和 ReadFile(),彼此之间进行信息交换。 c.连接终止,当客户端与服务端的通信结束,客户端调用 CloseHandle()断 开连接;而服务端接着调用 DisconnectNamedPipe()。
1
操作系统课程设计实验报告
int lastcmdposi; //最后一条命令是第几条命令 int subcmdparameter[10];//每条管道命令所带的参数个数 char* subcmd[10][10];//记录命令行中的每一个字符串 }cmd; 对于输入命令:mysort file1.txt file2.txt | myhead 6 | mycat –n 字符串的位置: 0 1 2 3 4 5 6 7 8
分别对应于 Linux 系统中的 ls cat
设计实现的时候用法做了简化。其中,mycat、myhead 和 mysort 为三条管道命 令,例如: mysort file1.txt file2.txt | myhead 6 | mycat -n
三、程序设计与实现
1、程序中使用的结构体 (1) 处理输入命令字符串的自定义结构体 CMD,定义如下 struct CMD{ int cmdposi[10];//记录每条管道命令在命令字符串中是第几个字符串
LPOVERLAPPED lpOverlapped//重叠属性 ); 说明:如果 lpOverlapped 为 NULL,那么,若管道已经连接,就返回 TRUE,若发 生错误,或者管道已经连接,就返回 0;如果 lpOverlapped 有效,就返回零。
(3) WaitNamedPipe()函数 作用:客户等候与管道创建者建立连接 调用格式: BOOL WINAPI WaitNamedPipe( LPCTSTR lpNamedPipeName,//将要连接的管道名称 DWORD ); 说明:当管道创建者已调用 ConnectNamePipe()函数等待与一个客户连接时,该 函数成功返回非 0,如果失败,或者管道不存在,则返回 0。 nTimeOut//等待时间,以秒为单位
图三
mytime 命令、myls 命令
wk.baidu.com
如上图三所示,mytime 命令可以计算可执行程序的执行时间,myls 命令可 以展开指定目录,并显示文件名称、创建时间、修改时间和文件大小。
6
操作系统课程设计实验报告
图四
mycp 命令
如上图四所示,mycp 命令其实就是实验五的任务,在将其收录进我们 shell 中。
(2)Windows 对于管道通信的设计机制简介 Windows 最大的特点是建立一个简单的客户机/服务器程序设计体系, 在这个 体系结构中,在客户机与服务器之间,数据既可以单向传递,也可双向流动。对 命令管道服务器和客户机来说,两者的区别在于:服务器是唯一一个有权创建命 名管道的进程,也只有它才能接受管道客户机的连接请求。对一个客户机应用来 说,它只能同一个现成的命名管道服务器建立连接。在客户机应用和服务器应用 之间,一旦建立好连接,两个进程都能使用标准的 Win32 函数,在管道上进行数 据的读取与写入。
2、使用的主要 Windows API (1) CreateNamedPipe()函数 作用:创建命名管道 调用格式: HANDLE WINAPI CreateNamedPipe( LPCTSTR lpName,//管道名称
3
操作系统课程设计实验报告
DWORD DWORD DWORD DWORD DWORD DWORD dwOpenMode,//管道打开方式 dwPipeMode,//管道数据组织方式 nMaxInstances,//管道最大实例量 nOutBufferSize,//输出缓冲区长度 nInBufferSize,//输入缓冲区长度 nDefaultTimeOut,//默认等待时间
相关文档
最新文档