操作系统实验报告四.docx

上传人:b****3 文档编号:10401632 上传时间:2023-05-25 格式:DOCX 页数:15 大小:145.50KB
下载 相关 举报
操作系统实验报告四.docx_第1页
第1页 / 共15页
操作系统实验报告四.docx_第2页
第2页 / 共15页
操作系统实验报告四.docx_第3页
第3页 / 共15页
操作系统实验报告四.docx_第4页
第4页 / 共15页
操作系统实验报告四.docx_第5页
第5页 / 共15页
操作系统实验报告四.docx_第6页
第6页 / 共15页
操作系统实验报告四.docx_第7页
第7页 / 共15页
操作系统实验报告四.docx_第8页
第8页 / 共15页
操作系统实验报告四.docx_第9页
第9页 / 共15页
操作系统实验报告四.docx_第10页
第10页 / 共15页
操作系统实验报告四.docx_第11页
第11页 / 共15页
操作系统实验报告四.docx_第12页
第12页 / 共15页
操作系统实验报告四.docx_第13页
第13页 / 共15页
操作系统实验报告四.docx_第14页
第14页 / 共15页
操作系统实验报告四.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验报告四.docx

《操作系统实验报告四.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告四.docx(15页珍藏版)》请在冰点文库上搜索。

操作系统实验报告四.docx

操作系统实验报告四

《操作系统》实验报告

实验序号:

 04         实验项目名称:

进程控制

学  号

1007012141

姓  名

黄丽金

专业、班

10计算机1班

实验地点

实验1#518

指导教师

李远敏

实验时间

2012-10-6

一、实验目的及要求

二、实验设备(环境)及要求

三、实验内容与步骤

内容:

(1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。

阅读该程序,完成实验任务。

源程序如下:

#include

#include

intmain(VOID)

﹛STARTUPINFOsi;

PROCESSINFORMATIONpi;

ZeroMemory(&si,sizeof(si));

Si.cb=sizeof(si);

ZeroMemory(&pi,sizeof(pi));

if(!

CreateProcess(NULL,

“c:

\WINDOWS\system32\mspaint.exe”,

NULL,

NULL,

FALSE,

0,

NULL,

NULL,

&si,&pi))

﹛fprintf(stderr,”CreatProcessFailed”);

return—1;

WaitForSingleObject(pi.hProcess,INFINITE);

Printf(“childComplete”);

CloseHandle(pi.hProcess);

CloseHandle(pihThread);

在“命令提示符”窗口运行CL命令产生可执行程序4-1.exe:

C:

\>CL4-1.cpp

编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。

它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。

确定运行进程的操作系统版本号。

阅读该程序并完成实验任务。

#include

#include

//利用进程和操作系统的版本信息的简单示例

Voidmain()

//提取这个进程的ID号

DWORDdwIdThis=:

:

GetCurrentProcessId();

//获得这一进程和报告所需的版本,也可以发送0以便指明这一进程

DWORDdwVerReq=:

:

GetProcessVersion(dwIdThis);

WORDwMajorReq=:

:

(WORD)dwVerReq>16);

WORDwMinorReq=:

:

(WORD)dwVerReq&oxffff);

std:

:

cout<<”ProcessID:

”<

<<”,requiresOS:

”<

:

endl;

//设置版本信息的数据结构,以便保存操作系统的版本信息

OSVERSIONINFOEXosvix;

:

:

ZeroMemory(&osvix,sizeof(osvix));

Osvix.dwOSVersionInfoSize=sizeof(osvix);

//提取版本信息和报告

:

:

GetVersionEx(reinterpretcast(&osvix));

Std:

:

cout<<”RunningonOS:

”<

<

:

endl;

//如果是NTS(Windows2000)系统,则提高其优先权

If(osvix.dwPlatformld==VERPLATFORMWIN32NT&&

Osvix.dwMajorVersion>=5

//改变优先级

:

:

SerPriorityClass(

:

:

GetCurrentProcess()//利用这一进程

HIGHPRIORITYCLASS);//改变为high

//报告给用户

Std:

:

cout<<”TaskManagershouldnownowindicatethis”

“processishighpriority.”<

:

endl;

实验任务:

写出程序运行后的以下几项结果。

当前PID信息3668。

当前操作系统版本OS:

5.1。

系统提示信息taskmanagershouldnownowindicatethisprocessishighpriority。

3.

终止进程

(3)编程三下面给出了一个终止进程的应用程序(文件名为4-3.cpp),它先创建一个子进程,然后命令它发出“自杀弹”互斥体去终止自身的运行。

阅读该程序并完成实验任务。

#include

#include

#include

saticLPCTSTRgszMutexName=”w2kdg.ProcTerm.mutex.Suicide”;

//创建当前进程的克隆进程的简单方法

VoidStartClone()

//提取当前可执行文件的文件名

TCHARszFilename﹝MAXPATH﹞

:

:

GetModuleFileName(NULL,szFilename,MAXPATH);

//格式化用于子进程的命令行,指明它是一个EXE文件和子进程

TCHARszCmdLine﹝MAXPATH﹞;

:

:

sprintf(szCmdLine,”\”%s\”child”,szFilename);

//子进程的启动信息结构

STARTUPINFOsi;

:

:

ZeroMemory(reinterpretcast(&si),sizeof(si));

si.cb=sizeof(si);//应当是此结构的大小

//返回的用于子进程的进程信息

PROCESSINFORMATIONpi;

//用同样的可执行文件名和命令行创建进程,并指明它是一个子进程

BOOLbCreateOK=:

:

CreateProcess(

SzFilename,//产生的应用程序名称(本EXE文件)

SzCmdLine,//告诉人们这是一个子进程的标志

NULL,//用于进程的默认的安全性

NULL,//用于线程的默认安全性

FALSE,//不继承句柄

CREATENEWCONSOLE,//创建新窗口,使输出更直观

NULL,//新环境

NULL,//当前目录

&si,//启动信息结构

&pi);//返回的进程的信息

//释放指向子进程的引用

if(bCreateOK)

:

:

CloseHandle(pi.hProcess);

:

:

CloseHandle(pi.hThread);

VoidParent()

//创建“自杀”互斥程序体

HANDLEhMutexSuicide=:

:

CreatgeMutex(

NULL,//默认的安全性

TRUE,//最初拥有的

gszMutexName);//为其命名

if(hMutexSuicide!

=NULL)

//创建子进程

std:

:

cout<<”Creatingthechildprocess.”<

:

endl;

:

:

StartClone();

//暂停

:

:

sleep(5000);

//指令子进程“杀”掉自身

std:

:

cout<<”Tellingthechildprocesstoquit.”<

:

endl;

:

:

ReleaseMutex(hMutexSuicide);

//消除句柄

:

:

CloseHandle(hMutexSuicide);

VoidChild()

//打开“自杀”互斥体

HANDLEhMutexSuicide=:

:

OpenMutex(

SYNCHRONIZE,//打开用于同步

FALSE,//不需要向下传递

gszMutexName);//名称

if(hMutexSuicide!

=NULL)

//报告正在等待指令

Std:

:

cout<<”Childwaitingforsuicideinstructions.”<

:

endl;

:

:

WaitForSingleObject(hMutexSuicide,INFINITE);

//报告准备好终止,消除句柄

Std:

cout<<”Childquiting.”<

:

endl;

:

:

CloseHandle(hMutexSuicide);:

:

sleep(1000);

intmain(intarqc,char*argv﹝﹞)

//决定其行为是父进程还是子进程

if(argc>1&&:

:

strcmp(argv﹝1﹞,”child”)==0)

Child();

else

Parent();

Return0;

步骤:

1.把实验指导书里的代码敲入VC++编译器,然后调试。

调试成功后,代开命令行窗口>cmd>C:

\ProgramFiles\MicrosoftVisualStudio\VC98\Bin放入运行窗口。

接着打入CL1.CPP按确定。

就可以输出1.exe文件来

2.修改程序后,单击Build菜单中的Compile2.cpp命令,再单击“是”按钮确认。

系统对2.cpp源程序进行编译。

编译完成后,单击Build菜单中的Build2.exe命令,建立2.exe可执行文件。

在工具栏单击ExecuteProgram(执行程序)按钮,执行2.exe程序。

在运行窗口的cmd,打入C:

\>CL2.CPP

3.在运行窗口的cmd,打入C:

\>CL3.CPP

 

四、实验结果与数据处理

改后的代码:

#include

#include

intmain(void)

{

STARTUPINFOsi;

PROCESS_INFORMATIONpi;

ZeroMemory(&si,sizeof(si));

si.cb=sizeof(si);

ZeroMemory(&pi,sizeof(pi));

if(!

CreateProcess(NULL,

"c:

\WINDOWS\system32\mspaint.exe",

NULL,

NULL,

FALSE,

0,

NULL,

NULL,

&si,&pi))

{

fprintf(stderr,"CreatProcessFailed");

return-1;

}

WaitForSingleObject(pi.hProcess,INFINITE);

printf("childComplete");

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

}

运行的结果:

2.

实验任务:

写出程序运行后的以下几项结果。

当前PID信息3668。

当前操作系统版本OS:

5.1。

系统提示信息taskmanagershouldnownowindicatethisprocessishighpriority。

改后的代码:

#include

#include

//利用进程和操作系统的版本信息的简单示例

voidmain()

{

//提取这个进程的ID号

DWORDdwIdThis=:

:

GetCurrentProcessId();

//获得这一进程和报告所需的版本,也可以发送0以便指明这一进程

DWORDdwVerReq=:

:

GetProcessVersion(dwIdThis);

WORDwMajorReq=(WORD)(dwVerReq>16);

WORDwMinorReq=(WORD)(dwVerReq&0xffff);

cout<<"ProcessID:

"<

<<",requiresOS:

"<

//设置版本信息的数据结构,以便保存操作系统的版本信息

OSVERSIONINFOEXosvix;

:

:

ZeroMemory(&osvix,sizeof(osvix));

osvix.dwOSVersionInfoSize=sizeof(osvix);

//提取版本信息和报告

:

:

GetVersionEx(reinterpret_cast(&osvix));

cout<<"RunningonOS:

"<

<

//如果是NTS(Windows2000)系统,则提高其优先权

if(osvix.dwPlatformId==VER_PLATFORM_WIN32_NT&&

osvix.dwMajorVersion>=5)

{

//改变优先级

:

:

SetPriorityClass(:

:

GetCurrentProcess(),//利用这一进程

HIGH_PRIORITY_CLASS);//改变为high

//报告给用户

cout<<"TaskManagershouldnownowindicatethis"

"processishighpriority."<

}

}

运行的图:

3.

改后的程序代码:

#include

#include

#include

staticLPCTSTRg_szMutexName="w2kdg.ProcTerm.mutex.Suicide";

//创建当前进程的克隆进程的简单方法

voidStartClone()

{

//提取当前可执行文件的文件名

TCHARszFilename[MAX_PATH];

:

:

GetModuleFileName(NULL,szFilename,MAX_PATH);

//格式化用于子进程的命令行,指明它是一个EXE文件和子进程

TCHARszCmdLine[MAX_PATH];

:

:

sprintf(szCmdLine,"\"%s\"child",szFilename);

//子进程的启动信息结构

STARTUPINFOsi;

:

:

ZeroMemory(reinterpret_cast(&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)

{

//创建子进程

cout<<"Creatingthechildprocess."<

:

:

StartClone();

//暂停

:

:

Sleep(5000);

//指令子进程“杀”掉自身

cout<<"Tellingthechildprocesstoquit."<

:

:

ReleaseMutex(hMutexSuicide);

//消除句柄

:

:

CloseHandle(hMutexSuicide);

}

}

voidChild()

{

//打开“自杀”互斥体

HANDLEhMutexSuicide=:

:

OpenMutex(

SYNCHRONIZE,//打开用于同步

FALSE,//不需要向下传递

g_szMutexName);//名称

if(hMutexSuicide!

=NULL)

{

//报告正在等待指令

cout<<"Childwaitingforsuicideinstructions."<

:

:

WaitForSingleObject(hMutexSuicide,INFINITE);

//报告准备好终止,消除句柄

cout<<"Childquiting."<

:

:

CloseHandle(hMutexSuicide);

:

:

Sleep(1000);

}

}

intmain(intargc,char*argv[])

{

//决定其行为是父进程还是子进程

if(argc>1&&:

:

strcmp(argv[1],"child")==0)

{

Child();

}

else

{

Parent();

}

return0;

}

运行的截图:

 

五、分析与讨论

六、教师评语

签名:

日期:

成绩

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2