哈工程第三讲进程的创建_第1页
哈工程第三讲进程的创建_第2页
哈工程第三讲进程的创建_第3页
哈工程第三讲进程的创建_第4页
哈工程第三讲进程的创建_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统实验报告课程名称操作系统实验课程编号0920311实验工程名称进程的创立学号2023061419年级20230614姓名史勇专业计算机科学与技术学生所在学院计算机学院指导教师初妍实验室名称地点21B376实验室哈尔滨工程大学计算机科学与技术学院第三讲进程的创立一、实验概述1.实验名称进程的创立2.实验目的练习使用EOSAPI函数CreateProcess创立一个进程,掌握创立进程的方法,理解进程和程序的区别。调试跟踪CreateProcess函数的执行过程,了解进程的创立过程,理解进程是资源分配的单位。3.实验类型验证型实验4.实验内容准备实验练习使用控制台命令创立EOS应用程序的进程练习通过编程的方式让应用程序创立另一个应用程序的进程调试CreateProcess函数调试PsCreateProcess函数练习通过编程的方式创立应用程序的多个进程二、实验环境WindowsXP系统、EOS实验系统、C语言三、实验过程1.设计思路和流程图练习使用控制台命令创立EOS应用程序进程的具体步骤如下:1.在EOS应用程序工程的“工程管理器〞窗口中双击Floppy.img文件,使用FloppyImageEditor工具翻开此软盘镜像文件。2.将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,Hello.exe文件即被添加到软盘镜像文件中。Hello.exe一个EOS应用程序,其源代码可以参见本实验文件夹中的Hello.c源文件。3.在FloppyImageEditor中选择“文件〞菜单中的“保存〞后关闭FloppyImageEditor。4.按F7生成EOS应用工程。5.按F5启动调试。OSLab会弹出一个调试异常对话框,并中断应用程序的执行。6.在调试异常对话框中选择“否〞,忽略异常继续执行应用程序。7.激活虚拟机窗口,待该应用程序执行完毕后,在EOS的控制台中输入命令“〞后回车。8.Hello.exe应用程序开始执行,观察其输出如图11-1。9.待Hello.exe执行完毕后可以重复第7步,或者结束此次调试。按照下面的步骤查看应用程序创立另一个应用程序的进程的执行结果:1.使用NewProc.c文件中的源代码替换之前创立的EOS应用程序工程中的EOSApp.c文件内的源代码。2.按F7生成修改后的EOS应用程序工程。3.按F5启动调试。OSLab会首先弹出一个调试异常对话框。4.在调试异常对话框中选择“否〞,继续执行。5.激活虚拟机窗口查看应用程序输出的内容,如图11-2。结合图11-1,可以看到父进程〔EOSApp.exe〕首先开始执行并输出内容,父进程创立了子进程〔Hello.exe〕后,子进程开始执行并输出内容,待子进程结束后父进程再继续执行。6.结束此次调试。按照下面的步骤调试CreateProcess函数创立进程的过程:1.按F5启动调试EOS应用程序,OSLab会首先弹出一个调试异常对话框。2.选择“是〞调试异常,调试会中断。3.在main函数中调用CreateProcess函数的代码行〔第57行〕添加一个断点。4.按F5继续调试,在断点处中断。5.按F11调试进入CreateProcess函数。此时已经开始进入EOS内核进行调试。调试PspCreateProcessEnvironment函数的步骤如下:1.在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行〔create.c文件的第163行〕,并在此行添加一个断点。2.按F5继续调试,到此断点处中断。3.按F11调试进入PspCreateProcessEnvironment函数。接下来调试初始化进程控制块中各个成员变量的过程:1.首先创立进程的地址空间,即4G虚拟地址空间。在代码行〔create.c文件的第437行〕NewProcess->Pas=MmCreateProcessAddressSpace();添加一个断点。2.按F5继续调试,到此断点处中断。3.按F10执行此行代码后中断。4.在“监视〞窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4G虚拟地址空间。5.使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视〞窗口中*NewProcess表达式的值,观察进程控制块中哪些成员变量是被哪些代码初始化的,哪些成员变量还没有被初始化。6.当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视〞窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视〞窗口中就可以继续观察新建进程控制块中的信息。7.接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。当调试到PsCreateProcess函数的最后一行代码时,查看进程控制块中的信息,此时所有的成员变量都已经被初始化了〔注意观察成员ImageName的值〕。8.按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看新建进程执行的结果。9.在OSLab中选择“调试〞菜单中的“停止调试〞结束此次调试。10.选择“调试〞菜单中的“删除所有断点〞。2.算法实现4.主要数据结构、实现代码及其说明5.源程序并附上注释#include"EOSApp.h"//main函数参数的意义://argc-argv数组的长度,大小至少为1,argc-1为命令行参数的数量。//argv-字符串指针数组,数组长度为命令行参数个数+1。其中argv[0]固定指向当前//进程所执行的可执行文件的路径字符串,argv[1]及其后面的指针指向各个命令行//参数。//例如通过命令行内容"a:\hello.exe-a-b"启动进程后,hello.exe的main函//数的参数argc的值为3,argv[0]指向字符串"a:\hello.exe",argv[1]指向//参数字符串"-a",argv[2]指向参数字符串"-b"。//intmain(intargc,char*argv[]){ // //启动调试EOS应用程序前要特别注意下面的问题: // //1、如果要在调试应用程序时能够调试进入内核并显示对应的源码, //必须使用EOS核心工程编译生成完全版本的SDK文件夹,然 //后使用此文件夹覆盖应用程序工程中的SDK文件夹,并且EOS //核心工程在磁盘上的位置不能改变。 //2、在启动调试应用程序之前必须首先删除/禁用所有的断点,在断 //点中断(int3)被命中后才能重新添加/启用断点,否那么启动 //调试会失败。STARTUPINFOStartupInfo; PROCESS_INFORMATIONProcInfo[10]; inta[10],i,j; ULONGulExitCode; //子进程退出码 INTnResult=0; //main函数返回值。0表示成功,非0表示失败。#ifdef_DEBUG __asm("int$3\nnop");#endifprintf("Createtenprocessesandwaitfortheprocessesexit...\n\n");//使子进程和父进程使用相同的标准句柄。 StartupInfo.StdInput=GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput=GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError=GetStdHandle(STD_ERROR_HANDLE); //为一个应用程序同时创立10个子进程。 for(i=0;i<10;i++) { if(CreateProcess("A:\\Hello.exe",NULL,0,&StartupInfo,&ProcInfo[i])) a[i]=1; elsea[i]=0; }for(j=0;j<10;j++) { if(a[j]){ //创立子进程成功,等待子进程运行结束。 // WaitForSingleObject(ProcInfo[j].ProcessHandle,INFINITE); //得到并输出子进程的退出码 GetExitCodeProcess(ProcInfo[j].ProcessHandle,&ulExitCode); } else{printf("CreateProcessFailed,Errorcode:0x%X.\n",GetLastError()); nResult=1;} for(j=0;j<10;j++) {printf("\nTheprocess%dexitwith%d.\n",j,ulExitCode); CloseHandle(ProcInfo[j].ProcessHandle); CloseHandle(ProcInfo[j].ThreadHandle);} }returnnResult;}6.程序运行时的初值和运行结果四、实验体会本次实验较为简单,属于验证型实验。实验过程中,在调试时添加监视对象时,因为少了*导致结果不正确,后请教同学后解决了,另外在动手实现10个进程创立的问题时,一开始没有头绪,后来和原创立2个进程的程序比照以及for循环提示,写出了程序,并和同学讨论后,修正了对进程创立失败时的操作。用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创立10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。对于不能创立成功的进程那么直接结束这个进程并且弹出错误信息,之后转到下一个进程,使进程之间不互相影响。通过这次实验,我对进程的相关知识增加了理解。有了动手实践的时机让我对于课本上进程的相关知识有了新的认识和更深的记忆。学习了如何创立进程和关闭句柄等,丰富了编程的相关知识。附:1.在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。能够交换这些函数调用的顺序吗?思考其中的原因。答:PspCreate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论