高等学校计算机操作系统实验报告最终答案(共56页).doc

上传人:飞****2 文档编号:14205174 上传时间:2022-05-03 格式:DOC 页数:56 大小:649KB
返回 下载 相关 举报
高等学校计算机操作系统实验报告最终答案(共56页).doc_第1页
第1页 / 共56页
高等学校计算机操作系统实验报告最终答案(共56页).doc_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《高等学校计算机操作系统实验报告最终答案(共56页).doc》由会员分享,可在线阅读,更多相关《高等学校计算机操作系统实验报告最终答案(共56页).doc(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上实验1进程的描述与控制Windows 2000编程(实验估计时间:100分钟)1.1 背景知识 Windows 2000 可以识别的应用程序包括控制台应用程序、GUI应用程序和服务应用程序。控制台应用程序可以创建GUI,GUI应用程序可以作为服务来运行,服务也可以向标准的输出流写入数据。不同类型应用程序间的惟一重要区别是其启动方法。 Windows 2000是以NT技术构建的,它提供了创建控制台应用程序的能力,使用户可以利用标准的C+工具,如iostream库中的cout和cin对象,来创建小型应用程序。当系统运行时,Windows 2000的服务通常要向系统用户提供

2、所需功能。 服务应用程序类型需要ServiceMail()函数,由服务控制管理器(SCM)加以调用。SCM是操作系统的集成部分,负责响应系统启动以开始服务、指导用户控制或从另一个服务中来的请求。其本身负责使应用程序的行为像一个服务,通常,服务登录到特殊的LocalSystem账号下,此账号具有与开发人员创建的服务不同的权限。 当C+编译器创建可执行程序时,编译器将源代码编译成OBJ文件,然后将其与标准库相链接。产生的EXE文件是装载器指令、机器指令和应用程序的数据的集合。装载器指令告诉系统从哪里装载机器代码。另一个装载器指令告诉系统从哪里开始执行进程的主线程。在进行某些设置后,进入开发者提供的

3、main()、Servicemain()或WinMain()函数的低级入口点。机器代码中包括控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。 Windows允许开发人员将大型应用程序分为较小的、互相有关系的服务模块,即动态链接库(DLL)代码块,在其中包含应用程序所使用的机器代码和应用程序的数据。 1.2 实验目的 通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。1.3 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1)一台运行Windows 2000 Profe

4、ssional 操作系统的计算机。 2)计算机中需安装Visual C+ 6.0 专业版或企业版。1.4 实验内容与步骤 (1)、简单的控制台应用程序 我们先来创建一个名为“Hello,World”的应用程序。 步骤1:登录进入Windows 2000 Professional。 步骤2:利用输入输出类iostream和std:cout编写一个控制台小程序,在屏幕上显示“hello,windows 2000”,并把代码保存为1-1.cpp。 步骤3:在“开始”菜单中单击“程序”、“附件”、“命令提示符”,进入Windows “命令提示符”窗口,并利用简单的标准命令行: C:CL 1-1.cpp

5、来创建可执行的1-1.exe。 操作能否正常进行?如果不行,原因是什么?解:首先将所需要的文件拷贝到相应的目录中,执行命令发现不能运行成功,首先是C盘根目录下面没有CL.exe文件.进入到文件夹C:Program FilesMicrosoft Visual StudioVC98Bin之后可以发现CL.exe文件,重新运行命令后仍然不能成功,显示fatal error C1034: iostream: no include path set错误,经查找资料可知,应该在命令行中首先运行VCVARS32.BAT 命令如下:C:Program FilesMicrosoft Visual StudioV

6、C98BinVCVARS32.BAT然后运行命令成功,成功生成1-1.exe 步骤4:运行1-1.exe程序,产生用户键入的一行文字。 运行结果(如果运行不成功,原因是什么?): 解:运行命令成功C:Program FilesMicrosoft Visual StudioVC98Bin1-1.exe输出结果:hello,windows 2000 (2)、GUI应用程序 在下面的实验中,用C+编译器创建一个GUI应用程序,代码应包括WinMain()方法,这是GUI类型的应用程序的标准入口点。 步骤1:用Windows.h头文件、WinMain()、MessageBox() API函数、用pra

7、gma指令指示编译器/连接器找到User32.lib库文件编写一段小程序,在屏幕上显示一个窗口,消息框中显示“Hello,Windows 2000,消息框标是用Greeting,消息框中设一个“OK”按钮,代码保存为1-2.cpp 步骤2:在“命令提示符”窗口运行CL.exe,产生1-2.exe文件: C:CL 1-2.cpp 运行结果: 解:运行结果如下:C:Program FilesMicrosoft Visual StudioVC98BinCL 1-2.cppMicrosoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168

8、for 80x86Copyright (C) Microsoft Corp 1984-1998. All rights reserved.1-2.cppMicrosoft (R) Incremental Linker Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved./out:1-2.exe1-2.obj运行1-2.exe 3、进程对象 操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄(HANDLE)的号码,就可与进程对象交互,这一号码只对当前进程有效。 本实验编写一

9、个简单的进程句柄的应用,在系统中运行的任何进程都可调用GetCurrentProcess() API函数,返回标识进程本身的句柄;再利用GetPriorityClass()获得进程的优先级,用cout函数在屏幕上把得到的进程优先级在屏幕上显示出来。 步骤1:将程序键入记事本中,并把代码保存为1-3.cpp 步骤2:在“命令提示符”窗口运行CL.exe,产生1-3.exe文件: C:CL 1-3.cpp 运行结果 C:Program FilesMicrosoft Visual StudioVC98BinCL 1-3.cpp/out:1-3.exe1-3.obj运行:C:Program Files

10、Microsoft Visual StudioVC98Bin1-3.exe输出结果:Current process priority:normal截图如下: 步骤3:编写一段程序,利用句柄查出进程的详细信息,首先利用Windows 2000的新特性工具帮助库tlhelp.h来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性,这一结构用来向OpenProcess() API函数提供进程的ID。Windows跟踪每一进程的有关时间,通过打开的进程句柄和GetProcessTime() API来查询得到有关时间。然后计算进程在内核模

11、式下消耗的时间占总时间的百分比。 将程序键入记事本中,并把代码保存为1-4.cpp。 步骤4:在“命令提示符”窗口运行CL.exe,产生1-4.exe文件: C:CL 1-4.cpp 运行结果:C:Program FilesMicrosoft Visual StudioVC98BinCL 1-4.cppMicrosoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x86Copyright (C) Microsoft Corp 1984-1998. All rights reserved.1-4.cppMicroso

12、ft (R) Incremental Linker Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved./out:1-4.exe1-4.obj运行1-4.exe1.5 实验总结1) 首先查找CL.exe文件的位置,然后将所需要的cpp代码文件拷贝到CL.exe所在的文件夹之中,保证在命令行模式执行命令的过程中不会出现找不到文件之类的低级错误。2) 通过本次实验我还学到了如何在命令行模式下编译C+程序,在直接尝试中遇到许多的错误,在解决错误的过程中我学到:cl.exe要用到MSDev98Bin目

13、录下的MSPDB60.DLL解决第一个错误的方法有以下几种:A. 将电脑目录C:Program FilesMicrosoft Visual StudioCOMMONMSDev98Bin下面的MSPDB60.DLL文件拷贝到CL.exe所在的文件夹中B在“我的电脑-属性-高级-环境变量”中, 添加如下变量:INCLUDEC:Program FilesMicrosoft Visual StudioVC98IncludeLIBC:Program FilesMicrosoft Visual StudioVC98LibC:ProgramFilesMicrosoftVisualStudioCommonMS

14、Dev98Bin;X:Program FilesMicrosoft Visual StudioVC98Bin3) 第三个错误fatal error C1034: iostream: no include path set错误。解决方案:经查找资料可知,应该在命令行中首先运行VCVARS32.BAT 命令如下:C:Program FilesMicrosoft Visual StudioVC98BinVCVARS32.BAT然后运行命令成功。在解决问题的同时我也学到:vcvars32.bat 文件设置适当的环境变量以启用 32 位命令行编译。4) 关于程序文件文件 1-1.cpp内容比较简单,就是

15、用C+输出hello,windows 2000文件1-2.cpp是用Windows.h头文件、WinMain()、MessageBox() API函数、用pragma指令指示编译器/连接器找到User32.lib库文件编写一段小程序,也就是一个简单的windows编程,再次熟悉了WinMain()函数。文件1-3.cpp是一个简单的进程句柄的应用,在系统中运行的任何进程都可调用GetCurrentProcess() API函数,返回标识进程本身的句柄;再利用GetPriorityClass()获得进程的优先级,用cout函数在屏幕上把得到的进程优先级在屏幕上显示出来。文件1-4.cpp利用Wi

16、ndows 2000的新特性工具帮助库tlhelp.h来获得当前运行的所有进程的快照。1.6 实验评价(教师) 实验2进程的描述与控制Windows 2000进程的一生(实验估计时间:100分钟)2.1 背景知识 Windows 2000 所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess()或TerminateProcess() API函数终止。通常应用程序的框架负责调用ExitProcess()函数,对于C+运行库来说,这一调用发生在应用程序的main()函数返回之后。 1. 创建

17、进程 CreateProcess()调用的核心参数是可执行文件运行时的文件名及其命令行。表2-1详细地列出了每个参数的类型和名称。表2-1 实验记录参数名称使用目的LPCTSTR lpApplivationNAME全部或部分地指明包括可执行代码的EXE文件的文件名LPCTSTR lpCommandLine向可执行文件发送的参数LPSECURIITY_ATTRIBUTESlpProcessAttributes返回进程句柄的安全属性,主要指明这一句柄是否应该由其他子进程所继承。LPSECURIITY_ATTRIBUTESlpThreadAttributes返回进程的主线程的句柄的安全属性BOOL

18、bInheritHandle一种标志,告诉系统允许新进程继承创建者进程的句柄 DWORD dwCreationFlage特殊的创建标志(如CREATE_SUSPENDED)的位标记LPVOID lpEnvironment向新进程发送的一套环境变量;如为null值则发送调用者环境LPCTSTR lpCurrentDirectory新进程的启动目录STARTUPINFO lpStartupInfoSTARTUPINFO结构,包括新进程的输入和输出配置的详情LPPROCESS_INFORMATION lpProcessInformation调用的结果块;发送新应用程序的进程和主线程的句柄和ID 可以

19、指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。 然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口,这一参数还允许设置进程的优先级

20、,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。 接着是CreateProcess()函数调用所需要的三个通常使用缺省值的参数,第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构中所必需的,用于在必要时指明新应用程序的主窗口的外观。 CreateProcess()的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区,以PROCESS_INFORMATION结构中返回的句柄调用Cl

21、ose_Handle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。 2. 正在运行的进程 如果一个进程程拥有至少一个执行线程,则为正在系统中运行的进程。通常这种进程使用主线程来指示它的存在,当主线程结束时,调用Exitprocess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。 首先可查看的进程特性是系统进程标识符(PID),可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess()相

22、似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用,其他可显示当前进程信息的API函数还有GetStartInfo()和GetprocessShutdownParameters(),可给出进程存活期内的配置详情。 通常,一个进程需要它运行期环境的信息,例如API函数GetModuleFileName()和GetcommandLine(),可以给出CreateProcess()中的参数以启动应用程序。在创建应用程序时可使用的另一个API函数是IsDebuggerPresent()。 可利用API函数GetGuiResources()来查看进程的GUI资源,此函数既可返回指定进程中的打

23、开的GUI对象的数目,也可返回指定进程中打开的USER对象的数目。进程的其他性能信息可通过GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorkingSetSize() API得到,以上这几个API函数都只需要具有PROCESS_QUERY_INFORMATION访问权限的指向所感兴趣进程的句柄。 另一个可用于进程信息查询的API函数是GetProcessVersion(),此函数只需感兴趣进程的PID(进程标识号)。 3. 终止进程 所有进程都是以调用ExitProcess()或者Te

24、rminateProcess()函数结束的,但最好使用前者而不要使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前者的。而外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能引起错误的行为。 TerminateProcess() API函数只要打开带有PROCESS_TERMINATE访问权的对象,就可以终止进程,并向系统返回指定的代码,这是一种“野蛮”的终止进程的方式,但是有时却是需要的。 如果开发人员确实有机会来设计“谋杀”(终止别的进程的进程)和“受害”进程(被终止的进程)时,应该创建一个进程间通信的内核对象,如一个互斥程序,这样一来,“

25、受害”进程只在等待或同期性地测试它是否应该终止。2.2 实验目的 1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000进程的“一生”。 2)通过编写和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。2.3 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1)一台运行Windows 2000 Professional 操作系统的计算机。 2)计算机中需安装Visual C+ 6.0 专业版或企业版。2.4 实验内容与步骤 请回答: Windows所创建的每个进程都是以调用Cre

26、ateProcess() API函数开始和以调用ExitProcess()或TerminateProcess() API函数终止。 1、创建进程 本实验学习创建进程的基本框架。该程序要求启动自身,显示它的系统进程ID和它在进程列表中的位置。 步骤1:登录进入Windows 2000 Professional。 步骤2:在“开始”菜单中单击“程序”、“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”,进入Visual C+窗口。 步骤3:在工具栏单击“新建”按钮,输入代码保存为2-1.cpp。 参考类和函数:windows.h、iostr

27、eam、stdio.h、StartClone()、GetModuleFileName、ZeroMemory。 步骤4:单击“Build”菜单中的“Compile 2-1.cpp”命令,对2-1.cpp进行编译。 步骤5:编译完成后,单击“Build”菜单中的“Build 2-1.exe”命令,建立2-1.exe可执行文件。 操作能否正常进行,如果不行,原因是什么?解:不能正常运行:屏幕一直在闪烁。原因:在错误的情况下,闪屏的ID一直是0,也就是说 if (nClone c_nCloneMax) / 发送新进程的命令行和克隆号 StartClone(+nClone) ; 中的nClone一直为0

28、,导致类似死循环的窗口闪烁。解决方案:语句: sprintf(szCmdLine,%sd%,szFilename,nCloneID);有语法错误,将其该为%d 步骤6:在工具栏单击“Execute program”按钮,或者按Ctrl+F5键,或者单击“Build”菜单中的“Execute 2-1.exe”命令,执行2-1.exe程序。 步骤7:按Ctrl+S键可暂停程序的执行,按Ctrl+Pause(Break)键可终止程序的执行。程序运行时屏幕显示的信息是:显示Clone从0-25的过程中 最后程序显示的结果是: 2. 正在运行的进程 本实验用进程信息查询的API函数GetProcessV

29、ersion()与GetVersionEx(),确定运行进程的操作系统的版本号。 步骤1:在工具栏单击“新建”按钮,编写代码保存为2-2.cpp。 步骤2:单击“Build”菜单中的“Compile 2-2.cpp”命令,系统对2-2.cpp进行编译。 步骤3:编译完成后,单击“Build”菜单中的“Build 2-2.exe”命令,建立2-2.exe可执行文件。 操作能否正常进行,如果不行,原因是什么? 程序能够正确执行。输出结果是: 步骤4:在工具栏单击“Execute program”按钮,执行2-2.exe程序。 运行结果: 当前PID信息: 当前操作系统版本: 系统提示信息:和系统对

30、比:可见显示是正确的。 除了改变进程的优先级以外,还可以对正在运行的进程执行几项其他的操作,只要获得其进程句柄即可,SetProcessAffinityMask() API函数允许开发人员将线程映射到处理器上;SetProcessAffinityBoost() API可关闭前台应用程序优先级的提升;而SetProcessWorkingSet() API可调节进程可用的非页面RAM的容量;还有一个只对当前进程可用的API函数,即SetProcessShutdownParameters(),可告诉系统如何终止该进程。 3. 终止进程 步骤1:在工具栏单击“新建”按钮,编写代码保存为2-3.cpp。

31、 步骤2:单击“Build”菜单中的“Compile 2-3.cpp”命令,再单击“是”按钮确认,系统对2-3.cpp进行编译。 步骤3:编译完成后,单击“Build”菜单中的“Build 2-3.exe”命令,建立2-3.exe可执行文件。 操作能否正常进行,如果不行,原因是什么? 解:能正确执行 步骤4:在工具栏单击“Execute program”按钮,执行2-3.exe程序。 运行结果及说明:运行程序之后,显示两个窗口:父窗口和子窗口 等待一段时间之后子进程杀死自身进程修改部分程序代码: std : cout Creating the child process. std : endl

32、; : StartClone() ; / 暂停 : Sleep(5000) ; / 指令子进程“杀”掉自身 std : cout Telling the child process to quit. 1 & : strcmp(argv1 , child )= 0) Child() ; else Parent() ; return 0;当mian()函数中的argc1 并且 : strcmp(argv1 , child )= 0是执行子进程,而不是首先执行父进程。这种直接在命令行下面向mian()函数传递参数的方式也是第一次接触,感触很深。又例如在2.1.exe中 if (argc 1) / 从

33、第二个参数中提取克隆ID : sscanf(argv1 , %d , &nClone) ;执行命令:C:Program FilesMicrosoft Visual StudioVC98BinDebug2-1.exe 5Process ID:5140, Clone ID:5最终创建的进程号就从5开始,而不是从0开始了。argc是命令行总的参数个数, argv是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数2.6 实验评价(教师)实验3进程的同步与通信Windows 2000线程同步(实验估计时间:100分钟)3.1 背景知识 Windows 2000 提供的常

34、用对象可分成三类:核心应用服务、线程同步和线程间通信,其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。此类对象包括互锁数据、临界区、事件、互斥信号量等。 多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界区和互斥信号量等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。 在进程内或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制(见表3-1)。表3-1 用于管理事件对象APIAPI名称描述CreateEvent()在内核中创建一个新的事件对象。此函数允许

35、有安全性设置、手工还是自动重置的标志以及初始时已接收还是未接收信号状态的标志。OpenEvent()创建对已经存在的事件对象的引用。此API函数需要名称、继承标志和所需的访问级别。SetEvent()将手工重置事件转化为已接收信号状态。ResetEvent()将手工重置事件转化为非接收信号状态。PulseEvnt()将自动重置事件对象转化为已接收信号状态。当系统释放所有的等待它的线程时此种转化立即发生。 与事件对象类似,互斥信号量容易创建、打开、使用并清除。利用CreateMutex()API函数可创建互斥信号量,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所

36、有的初始化工作时,才允许创建线程释放互斥信号量。 为了获得互斥信号量,首先,想要访问调用的线程可使用OpenMutex()API函数来获得指向对象的句柄;然后,线程将这个句柄提供给一个等待函数。当内核将互斥信号量对象发送给等待线程时,就表明该线程获得了互斥信号量的拥有权。当线程获得拥有权时,线程控制了对共享资源的访问必须设法尽快地放弃互斥信号量。放弃共享资源时需要在该对象上调用ReleaseMutex()API。然后系统负责将互斥信号量拥有权传递给下一个等待着的线程(由到达时间决定顺序)。3.2 实验目的 在本实验中,通过对事件和互斥信号量对象的了解,加深对Windows 2000线程同步的理

37、解。 1)回顾系统进程、线程的有关概念,加深对Windows 2000的理解。 2)了解事件和互斥信号量对象。 3)通过分析实验程序,了解管理事件对象的API。 4)了解在进程中如何使用事件对象。 5)了解在进程中如何使用互斥信号量对象。 6)了解父进程创建子进程的程序设计方法。3.3 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1)一台运行Windows 2000 Professional 操作系统的计算机。 2)计算机中需安装Visual C+ 6.0 专业版或企业版。3.4 实验内容与步骤 1. 事件对象 在进程间使用事件。父进程启动时,利用Creat

38、eEvent()API创建一个命名的、可共享的子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent()API打开事件对象,调用SetEvent()API使其转化为已接收信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000 Professional。 步骤2:在“开始”菜单中单击“程序”、“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”,进入Visual C+窗口。 步骤3:在工具栏单击“新建”按钮,编写代码保存为3-1.cpp。 程序功能:创建和打开事件对象在进程

39、间传送信号。 参考类和函数:windows.h、iostream、CreateChild()、szFilename、GetModuleFileName、szCmdLine、CloseHandle、WaitForChild()。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,单击“是”按钮确认,系统对3-1.cpp进行编译。 步骤5:编译完成后,单击“Build”菜单中的“Build3-1.exe”命令,建立3-1.exe可执行文件。 操作能否正常进行,如果不行,原因是什么? 解:程序能够正常执行。 步骤6:在工具栏单击“Execute program”按钮,执行3-

40、1.exe程序。运行结果(分行书写,如果不成功,原因是什么?):在去掉: Sleep(1500);之前的运行结果是:1. event created2. chlid created3. Parent waiting on child.4. child process begining.5. event signaled6. parent received the envent signaling from child7. Parent released. 去掉: Sleep(1500);语句:1. event created2. chlid created3. Parent waitingc

41、on chhiildl.4. d process begining.5. eparvent erentceived the ensivegnt nsiganlalinge frd6. om child7. Parent released.这个结果与你期望的一致吗?(从进程并发的角度对结果进行分析)。分析可知:在有Sleep(1500);时,主程序会等待子程序1.5s,这样的话子程序先输出,然后主程序再输出。这样的话就不会出现错误。而当去掉: Sleep(1500);语句之后主程序和字程序同时输出就会出现输出结果重叠的情况,变现为输出结果错误。 请回答: 1)程序中,创建一个事件使用了哪一个系统

42、函数?创建时设置的初始信号状态是什么? a)创建事件用CreateEvent()函数 b)CreateEvent( NULL,/ 缺省的安全性,子进程将具有访问权限 TRUE,/ 手工重置事件,必须用ResetEvent函数来手工将事件的状态复原到无信号状态 FALSE,/ 初始时是非接受信号状态,为TRUE,初始状态为有信号状态 g_szContinueEvent);/ 事件名称,指定事件的对象的名称,是一个以0结束的字符串指针 2)创建一个进程(子进程)使用了哪一个系统函数? 创建子进程使用BOOL CreateProcess( LPCTSTRlpApplicationName, /指向一个NULL结尾的、用来指定可执行模块的字符串。 LPTSTRlpCommandLine, /指向一个NULL结尾的、用来指定要运行的命令行。 LPSECURITY_ATTRIBUTESl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁