操作系统实验-第二讲、进程的创建

  • 格式:doc
  • 大小:529.50 KB
  • 文档页数:10

下载文档原格式

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

操作系统

实验报告

哈尔滨工程大学

计算机科学与技术学院

第三讲进程的创建

一、实验概述

1. 实验名称

进程的创建

2. 实验目的

1)、练习使用 EOS API 函数 CreateProcess 创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

2)、调试跟踪 CreateProcess 函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。

3. 实验类型(验证、设计)

验证型

4. 实验内容

1)、准备实验

2)、练习使用控制台命令创建 EOS 应用程序的进程

3)、练习通过编程的方式让应用程序创建另一个应用程序的进程

4)、调试 CreateProcess 函数

5)、调试 PsCreateProcess 函数

6)、练习通过编程的方式创建应用程序的多个进程

二、实验环境

进行实验使用的操作系统、编译器、语言及工具等。

操作系统:Windows XP

编译器: Tevalaton OS Lab

语言: C++

三、实验过程(每次实验不一定下面6条都写,根据实际情况定)

*需要解决的问题以及解答

(1)、程序创建2个进程创建的情况下,实验指导P133-4的*NewProcess和6的*ProcessObject变化情况,监控变量界面截图。

答:

在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行(create.c文件的163行),并在此行添加一个断点。按 F5继续调试,到此断点处中断。按F11调试进入 PspCreateProcessEnvironment 函数。

在调用ObCreateObject函数的代码行(create.c文件的第418行)添加一个断点。按F5继续调试,到此断点处中断。按F10执行此函数后中断。

将表达式*NewProcess添加到“监视”窗口中,继续一步步调试可以观察到进程控制块的成员变量的值的变化,如下图:

接下来调试初始化进程控制块中各个成员变量的过程:

当从 PspCreateProcessEnvironment 函数返回到 PsCreateProcess 函数后,停止按 F10。此时“监视”窗口中已经不能再显示表达式*NewProcess 的值了,在PsCreateProcess 函数中是使用ProcessObject 指针指向进程控制块的,所以将表达式*ProcessObject 添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。接下来继续使用F10一步步调试 PsCreateProcess 函数中的代码,同样要注意进程控制块中的成员变量的变化:

(2)、尝试根据之前PsCreateProcess 函数和PspCreateProcessEnvironment 函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。

答:

(3)、思考与练习,在源代码文件NewTwoProc.c 提供的源代码基础上进行修改,要求使用hello.exe 同时创建10个进程。要给出源代码及解释和运行界面截图。

答:

1). 设计思路

创建10个进程时,可以使用 PROCESS_INFORMATION 类型定义一个有 10 个元素的数组,每一个元素对应一个进程。使用一个循环创建 10

个子进程,然后再使用一个循环等待 10 个子进程结束,得到退出码后

关闭句柄。

2). 算法实现

在创建10个进程的程序中,为了保证只有在10个进程都创建成功的情况下才执行后续操作,引入一个变量flag,只有10个程序都创建

成功时flag=1,出现创建失败的情况时flag=0,当flag=1时再执行后

续操作。否则直接关闭已创建的进程并退出系统。

附实现代码:

#include "EOSApp.h"

STARTUPINFO StartupInfo;

PROCESS_INFORMATION my_process[10];

ULONG ulExitCode; //子进程退出码

INT nResult=0; //main函数返回值。0表示成功,非0表示失败。

#ifdef _DEBUG

__asm("int $3\n nop");

#endif

printf("Create ten processes and wait for the processes exit...\n\n");

//使子进程和父进程使用相同的标准句柄。

StartupInfo.StdInput=GetStdHandle(STD_INPUT_HANDLE);

StartupInfo.StdOutput=GetStdHandle(STD_OUTPUT_HANDLE);

StartupInfo.StdError=GetStdHandle(STD_ERROR_HANDLE);

int i;

int flag = 1;

int cnt = 0;

for(i=0; i<10; i++) {

//Create ten processes at the same time

if(CreateProcess("A:\\Hello.exe", NULL, 0, &StartupInfo, &my_process[i])) //if ok jump

cnt++;

else {

//else output error

printf("CreateProcess Failed,Error code:0x%X.\n", GetLastError());

nResult = 1;

flag = 0;

break;

//if flag == 0 there must be some error

}

}

if(flag == 1){

//创建子进程成功,等待子进程运行结束。

for(i=0; i<10; i++) {

WaitForSingleObject(my_process[i].ProcessHandle, INFINITE);

}

//得到并输出子进程的退出码。

for(i=0; i<10; i++){

GetExitCodeProcess(my_process[i].ProcessHandle,

&ulExitCode);

printf("\nThe process%d exit with%d.\n", i+1, ulExitCode);

}