湖南科技学院计算机与通信工程系《操作系统》实验报告实验项目实验二进程管理课程名称操作系统成绩实验时间2014年12月15日星期三第十六周实验地点E座305姓名学号班级计科1302班一、实验要求1、设计实验步骤;2、将上机过程中出现的问题及解决方法写在实验报告上;3、掌握WINDOWS进程管理的知识。4、认真完成实验报告二、实验目的1、通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。2、通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。三、实验环境VC++6.0四、实验内容及步骤:(1).创建进程本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。步骤1:创建一个“Win32ConsolApplication”工程,然后拷贝清单2-1中的程序,编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:范例:E:\课程\os课\os实验\程序\os11\debugos21(假设编译生成的可执行文件是os21.exe)按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:范例:E:\课程\os课\os实验\程序\os11\debugos213(假设编译生成的可执行文件是os21.exe)按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:步骤4:修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:从中你可以得出什么结论:nClone的作用:控制程序的起始输入值,控制窗口个数,当nClone5时,程序就会停止执行变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?变量的定义和初始化方法(位置)对程序的执行结果有影响,例如当nClone第二次修改的时候,程序就无法停止执行。(2).父子进程的简单通信及终止进程步骤1:创建一个“Win32ConsolApplication”工程,然后拷贝清单2-2中的程序,编译成可执行文件。步骤2:在VC的工具栏单击“ExecuteProgram”(执行程序)按钮,或者按Ctrl+F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:范例:E:\课程\os课\os实验\程序\os11\debugos22(假设编译生成的可执行文件是os22.exe)步骤3:按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果:在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述:程序通过main()来传递参数,当argc的值大于1时,程序继续执行,当argc的值小于1时,程序结束执行。步骤4:填空CreateProcess()函数有5个核心参数?本实验程序中设置的各个参数的值是:a._______________szFilename_________________________;b.________________szCmdLine________________________;c.________________NULL____________________________;d._________________NULL___________________________;e._________________FLASE__________________________;f._________________CREATE_NEW_CONSOLE_________;g.__________________NULL__________________________;h.__________________NULL__________________________;i.&si;j.π步骤5:按源程序中注释中的提示,修改源程序2-2,编译执行。运行结果:步骤6:参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述:CreateMutex()创建互斥体进程,OpenMutex()打开互斥体进程,ReleaseMutex()释放互斥体,WaitForSingleObject()检测hHandle事件的信号状态,通过这些方法可实现当前只有一个进程被创建或使用,实现进程的同步。五、实验运行结果(1)2.程序运行截图2.任务管理器截图3.加参数后运行截图4.第一次修改截图六、实验分析和总结:此次实验,我们创建了进程,并根据对实验程序、实验代码的分析、观察,我们了解了一个Windows应用程序的“一生”。同时也初步的了解了父子进程间的通信,以及终止进程。但是从个人对实验的理解来看,似乎没有完全弄懂实验的内容,所以在后期需要在这方面的知识加强学习。七、实验程序代码://proccreate项目#includewindows.h#includeiostream#includestdio.h//创建传递过来的进程的克隆过程并赋于其ID值voidStartClone(intnCloneID){//提取用于当前可执行文件的文件名TCHARszFilename[MAX_PATH];GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子进程的命令行并通知其EXE文件名和克隆IDTCHARszCmdLine[MAX_PATH];sprintf(szCmdLine,\%s\%d,szFilename,nCloneID);//用于子进程的STARTUPINFO结构STARTUPINFOsi;ZeroMemory(&si,sizeof(si));si.cb=sizeof(si);//必须是本结构的大小//返回的用于子进程的进程信息PROCESS_INFORMATIONpi;//利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质BOOLbCreateOK=::CreateProcess(szFilename,//产生这个EXE的应用程序的名称szCmdLine,//告诉其行为像一个子进程的标志NULL,//缺省的进程安全性NULL,//缺省的线程安全性FALSE,//不继承句柄CREATE_NEW_CONSOLE,//使用新的控制台NULL,//新的环境NULL,//当前目录&si,//启动信息&pi);//返回的进程信息//对子进程释放引用if(bCreateOK){CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}}intmain(intargc,char*argv[]){//确定派生出几个进程,及派生进程在进程列表中的位置intnClone=0;//修改语句:intnClone;//第一次修改:nClone=0;if(argc1){//从第二个参数中提取克隆ID::sscanf(argv[1],%d,&nClone);}//第二次修改:nClone=0;//显示进程位置std::coutProcessID:::GetCurrentProcessId(),CloneID:nClonestd::endl;//检查是否有创建子进程的需要constintc_nCloneMax=5;if(nClonec_nCloneMax){//发送新进程的命令行和克隆号StartClone(++nClone);}//等待响应键盘输入结束进程getchar();return0;}清单2-2父子进程的简单通信及终止进程的示例程序//procterm项目#includewindows.h#includeiostream#includestdio.hstaticLPCTSTRg_szMutexName=w2kdg.ProcTerm.mutex.Suicide;//创建当前进程的克隆进程的简单方法voidStartClone(){//提取当前可执行文件的文件名TCHARszFilename[MAX_PATH];GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子进程的命令行,字符串“child”将作为形参传递给子进程的main函数TCHARszCmdLine[MAX_PATH];//实验2-2步骤3:将下句中的字符串child改为别的字符串,重新编译执行,执行前请先保存已经完成的工作sprintf(szCmdLine,\%s\child,szFilename);//子进程的启动信息结构STARTUPINFOsi;ZeroMemory(&si,sizeof(si));si.cb=sizeof(si);//应当是此结构的大小//返回的用于子进程的进程信息PROCESS_INFORMATIONpi;//用同样的可执行文件名和命令行创建进程,并指明它是一个子进程BOOLbCreateOK=CreateProcess(szFilename,//产生的应用程序的名称(本EXE文件)szCmdLine,//告诉我们这是一个子进程的标志NULL,//用于进程的缺省的安全性NULL,//用于线程的缺省安全性FALSE,//不继承句柄CREATE_NEW_CONSOLE,//创建新窗口NULL,//新环境NULL,//当前目录&si,//启动信息结构&pi);//返回的进程信息//释放指向子进程的引用if(bCreateOK){CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}}voidParent(){//创建“自杀”互斥程序体HANDLEhMutexSuicide=CreateMutex(NULL,//缺省的安全性TRUE,//最初拥有的g_szMutexName);//互斥体名称if(hMutexSuicide!=NULL){//创建子进程std::coutCreatingthechildprocess.std::endl;StartClone();//指令子进程“杀”掉自身std::coutTellingthechildprocesstoquit.std::endl;//等待父进程的键盘响应getchar();//释放互斥体的所有权,这个信号会发送给子进程的WaitForSingleObject过程ReleaseMutex(hMutexSuicide);//消除句柄CloseHandle(hMutexSuicide);}}voidChild(){//打开“自杀”互斥体HANDLEhMutexSuicide=OpenMutex(SYNCHRONIZE,//打开用于同步FALSE,//不需要向下传递g_szMutexName);//名称if(hMutexSuicide!=NULL){//报告我们正在等待指令std::coutChildwaitingforsuicideinstructions.std::endl;//子进程进入阻塞状态,等待父进程通过互斥体发来的信号WaitForSingleObject(hMutexSuicide,INFINITE);//实验2-2步骤5:将上句改为WaitForSingleObject(hMutexSuicide,0),