《计算机操作系统》实验指导书 联系客服

发布时间 : 星期三 文章《计算机操作系统》实验指导书更新完毕开始阅读32c67cc3d5bbfd0a79567304

实验四 输入输出管理

二、实验目的

在本实验中,我们通过一个应用程序示例来讨论鼠标编程技巧,了解如何响应鼠标消息和如何在应用程序中捕获鼠标,从而加深理解Windows 2000输入/输出处理技术。

通过Linux重定向和管道操作,熟悉并掌握Linux环境下输入/输出重定向技术。掌握把标准输出重定向创建一个文件;防止使用重定向的时候覆盖文件;把输出追加到一个现有的文件中;

把一个命令的输出导入到另一个命令中。

通过对机器内部扬声器的编程,了解和学习Linux内部设备的控制和管理方法。

二、实验环境

硬件环境:计算机一台,局域网环境;

软件环境:Windows 2000 Professional,Linux Redhat 9.0,Visual C++ 6.0专业版或企业版。 三、实验内容和步骤

第一部分 Windows鼠标处理

一台计算机拥有大量的输入设备,而鼠标和键盘是其中最常用的输入设备。实际上,基本的鼠标和键盘处理就像使用Visual C++ 的Class Wizard在MFC程序中添加一两个消息响应函数一样简单。

在本实验中,我们通过一个应用程序示例来讨论鼠标编程技巧,了解如何响应鼠标消息和如何在应用程序中捕获鼠标。

该程序的实例代码在实验指导书外另附。 步骤1:登录进入Windows 2000 Professional。

步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”-“Microsoft Visual C++ 6.0”命令,进入Visual C++ 窗口。

步骤3:在File菜单单击Open Workspace...命令,在“Open Workspace”对话框中找到实验代码文件夹并打开实验文件Mouse.dsw。

步骤4:单击Build菜单中的Build Mouse.exe命令,系统对程序进行编译并建立可执行文件。 操作能否正常进行?如果不行,则可能的原因是什么?

____________________________________________________________________ ________________________________________________________________________ 步骤5:在工具栏单击“Execute Program”按钮,执行Mouse.exe程序,响应鼠标消息。 Mouse示例程序演示了如何截取和响应鼠标消息。运行这个程序,就会显示一个主窗口。最初窗口是空白的,但是直接在窗口中移动鼠标,WM_MOUSEMOVE消息就会出现在窗口上,同时显示鼠标的坐标。在鼠标经过窗口时单击鼠标左键,窗口中不仅出现WM_LBUTTONDOWN和WM_LBUTTONUP消息,而且显示事件发生的坐标。单击鼠标右键,再次出现上述情况。

请记录: WM_MOUSEMOVE X: __________ Y: __________ WM_LBUTTONDOWN X: __________ Y: __________ WM_LBUTTONUP X: __________ Y: __________ WM_RBUTTONDOWN X: __________ Y: __________ WM_RBUTTONUP X: __________ Y: __________

观察演示情况,请说明,显示的各消息反映了什么鼠标事件? WM_MOUSEMOVE :___________________________________________ WM_LBUTTONDOWN :___________________________________________ WM_LBUTTONUP :___________________________________________ WM_RBUTTONDOWN :___________________________________________ WM_RBUTTONUP :___________________________________________

步骤6:捕获鼠标消息。

Mouse应用程序也举例说明了鼠标捕获的技巧。有些时候需要应用程序接收鼠标消息,甚至鼠标不在应用程序客户区时,也有这个要求。例如在一个画图程序中,用户在窗口中画线时一直

接住鼠标左键。如果一个用户碰巧把鼠标指针移到画图应用程序的窗口之外,应用程序必须继续接收鼠标消息。否则用户在窗口之外释放鼠标按钮,应用程序将无法知道用户是否仍旧在画图。

为了解鼠标捕获的工作情况,可把指针移动到Mouse应用程序的客户区,然后一直按住鼠标右键,在屏幕上任意移动鼠标。即使鼠标移动到窗口外,窗口继续接收鼠标消息。

在不按住鼠标右键移动鼠标时,鼠标指针离开了应用程序的客户区的情况下,应用程序停止接收鼠标消息。

注意到,在按住鼠标右键移动到客户区外面左侧时,WM_MOUSEMOVE的坐标值现在为负的。这是因为什么?

____________________________________________________________________ 步骤7:测试 Mouse应用程序

由于在窗口的视图类CMouseView 中定义了消息响应函数,Mouse应用程序会响应鼠标消息。作为MFC编程的一条规则,CMouseView使用消息映射把消息和消息响应函数联系起来。下面的代码显示CMouseView类如何定义它的消息映射。

BEGIN_MESSAGE_MAP(CMouseView, CView) // { {AFX_MSG_MAP(CMouseView) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_RBUTTQNDOWN() ON_WM_RBUTTONUP()

ON_WM_LBUTTONDBLCLK() ON_WM_RBUTTONDBLCLK() // } } AFX_MSG_MAP END_MESSAGE_MAP()

每一个包含消息映射体的宏把鼠标消息和适当的消息处理程序相关联。例如,当窗口接收WM_MOUSEMOVE消息时,ON_WM_MOUSEMOVE宏通知MFC调用OnMouseMove() 函数。同样,当窗口接收WM_LBUTTONDOWN消息时,消息映射通知MFC调用OnLButtonDown() 函数。

出现在Mouse应用程序窗口的文本由视图类消息响应函数来显示。例如,下列代码显示了OnMouseMove() 函数:

void CMouseView :: OnMouseMove(UINT nFlags, CPoint point) {

// 消息处理代码和 (或) 调用缺省的处理过程 char str[50] ;

CClientDC dc(this) ;

dc.TextOut(20, 20, “WM_MOUSEMOVE” ) ;

wsprintf(str, “X: %d Y: %d ” , point.x, point.y) ; dc.TextOut(200, 20, str) ;

CView :: OnMouseMove(nFlags, point) ;

}

在鼠标指针移动到应用程序窗口时,Mouse应用程序接收这些消息流。作为函数的第二个参数传送的CPoint对象包含了在事件发生时鼠标指针所在位置的信息。OnMouseMove从CPoint对象中建立一个显示的字符串,并且在应用程序的窗口中显示这个字符串。

OnLButtonDown() 、OnLButtonUp() 、OnLButtonDblClk() 和OnRButtonDblClk()函数工作情况相似,把CPoint对象转变为在应用程序窗口中显示的显示字符串。

步骤8:读懂Windows 2000获取鼠标消息的函数以及对事件处理的代码,在此基础上修改原程序段,产生新的响应事件:

1) 修改鼠标左键单击后的事件,使在单击鼠标后,在单击的位置上出现“你好”字样。 2) 修改鼠标右键单击释放的事件,使在单击鼠标按下的位置出现“再”字,在释放右键的位置上出现“见”字。

操作是否成功?如果不行,则可能的原因是什么?

____________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ 步骤9:单击窗口右上角的“关闭”按钮,结束程序的运行。

第二部分 Linux重定向和管道

在本实验中将会用到下列命令: pwd: 显示当前的工作路径。 cd: 改变目录路径。 ls: 显示指定目录的内容。 more: 分页显示文件的内容。这是用于显示文本文件的首选方法。 head: 截取显示文件的开头部分 (默认为开头10行) 。 tail: 截取显示文件的结尾部分 (默认为最后10行) 。 cal: 有关日历的命令。 set: shell特性的设置。 echo: 显示变量的值。 ps: 显示当前进程。 data: 显示或设置系统日期和时间。 grep: 查找文件中有无指定的关键字。

1. 使用重定向标准输出符号

重定向标准输出,创建一个文件。

右尖括号或称大于符号 (>) 把命令的输出发送到一个文件中:使用单个右尖括号,当指定文件名不存在的时候,将创建一个新文件;如果文件名存在,它将被覆盖。(注意:命令、重定向符号和文件名之间的空格是可选的) 。

重定向标准输出命令的格式是: command > file

1) 为核实当前所在目录位置,使用什么命令?

____________________________________________________________________ 如果当前位置不在主目录中,使用什么命令可以改变到主目录中?

____________________________________________________________________ 2) 如果希望把文件和目录列表截获,存储为主目录中的一个文件,这样可以追踪主目录中有什么文件。使用什么命令,把长文件列表的输出重定向,创建一个叫做homedir.list的文件。

____________________________________________________________________ 3) 新文件homedir.list被放在哪里?

____________________________________________________________________ 使用ls命令核实新文件存在。

4) 使用什么命令,以一次一屏的方式,来查看刚才创建的文件内容?

____________________________________________________________________

5) 使用head命令截获homedir.list文件的前10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。应该使用什么命令?

____________________________________________________________________ 使用more命令查看文件的内容。

6) 使用tail命令,截获homedir.list文件的最后10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。使用什么命令?

____________________________________________________________________ 使用more命令查看文件的内容。 7) 截获cal -y命令的输出,把它存到名为calendar的文件中。查看文件的内容。截获了什么? ____________________________________________________________________

8) 截获cal 2010命令的输出,把它存到名为calendar的文件中。查看文件的内容。其中有什么内容?

____________________________________________________________________ 日历有什么变化?

____________________________________________________________________

防止使用重定向的时候覆盖文件。

在bash shell中,一个叫做noclobber的选项可以用来设定防止在重定向的过程中覆盖文件。可以在命令行中使用$set -o noclobber命令来完成。o代表选项。

为了重新激活clobber特性,使用$set -o noclobber;撤消则用set +o noclobber。 如果你使用的是csh shell,为了激活/撤消C shell中的clobber特性,使用set noclobber和unset noclobber。

1) 输入命令,打开shell中的noclobber选项。输入什么命令?

____________________________________________________________________ 2) 输入命令ls -l > homedir.list,结果是什么?

____________________________________________________________________ 3) 输入命令ls -l > homedir.list2,结果是什么?

____________________________________________________________________

向现有的文件追加输出。

如果想向一个现有的文件追加 (添加到末尾) 文本而不是覆盖它,可以使用双右尖括号 (>>) 。这个选项当文件不存在的时候,会创建一个新文件,或者追加到已有文件。

追加命令的格式是: command >> file

1) 输入命令,显示“Happy Bday”一行字,使用重定向符号截获输出,把它存到叫做bday4me的文件中。使用什么命令?

____________________________________________________________________

2) 输入命令,显示“YOURNAME!”一行字,使用双重定向符号,把输出追加到bday4me文件中。查看bday4me文件的内容。其中有什么?

____________________________________________________________________

3) 输入命令,显示您出生年月的日历 (如果在1985年的6月出生,输入cal 6 1985) ,使用双重定向符号,把输出追加到bday4me文件中。使用什么命令?

____________________________________________________________________ 4) 查看bday4me文件的内容。注意这3个命令的输出在bday4me文件中已经被组合起来了。您是在一周中的哪一天出生的?

____________________________________________________________________

2. 使用管道符号

把命令的输出导入到另一个命令中。

1) 使用管道元字符,发送ls -l命令的输出,作为more命令的输入 (注意:如果在当前目录中没有太多的文件,使用 /etc目录获取长列表) 。把输出作为more命令的输入的时候,得到什么结果?

____________________________________________________________________ 2) 查看使用ls –l | more命令列出来的文件,注意创建或修改的日期。为了查看在同一个月被创建或修改的文件或目录的列表,可以使用grep命令对那个月进行搜索。当月份显示在列表中的时候,指定它 (例如:Oct) 。输入命令ls -1 | grep Oct (或者想查找的月份) 。结果是什么?

____________________________________________________________________ 3) 目录总是4096字节大小。输入命令ls -1 | grep 4096。产生的列表是什么?

____________________________________________________________________ ________________________________________________________________________ 4) 可以使用多个管道连接多个命令。输入取得长文件列表输出的命令,把它输入给tail命令,然后到sort命令。输入的命令是:

____________________________________________________________________

5) ps (进程状态) 命令用于查看Linux系统中运行什么进程。把ps -e命令的输出输入给more命令。-e选项将给出每一个在系统中运行的进程。把输出输入到more命令中的结果是什么?

____________________________________________________________________