操作系统实验报告四.docx
《操作系统实验报告四.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告四.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统实验报告四
《操作系统》实验报告
实验序号:
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;
}
运行的截图:
五、分析与讨论
六、教师评语
签名:
日期:
成绩