操作系统实验3进程控制.docx
- 文档编号:23750700
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:9
- 大小:159.88KB
操作系统实验3进程控制.docx
《操作系统实验3进程控制.docx》由会员分享,可在线阅读,更多相关《操作系统实验3进程控制.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统实验3进程控制
《操作系统》实验报告
实验序号:
3 实验项目名称:
进程控制
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
(1)通过对WindowsXP进行编程,来熟悉和了解系统。
(2)通过分析程序,来了解进程的创建、终止。
二、实验设备(环境)及要求
(1)一台WindowsXP操作系统的计算机。
(2)计算机装有MicrosoftVisualStudioC++6.0专业版或企业版。
三、实验内容与步骤
(1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。
阅读该程序,完成实验任务。
源程序如下:
#include"stdafx.h"
#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);
};
四、程序调试(结果及分析)
编程一:
(1)利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。
阅读该程序,完成实验任务。
源程序如下:
(2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。
它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。
确定运行进程的操作系统版本号。
阅读该程序并完成实验任务。
#include"stdafx.h"
#include
#include
//利用进程和操作系统的版本信息的简单示例
voidmain()
{
//提取这个进程的ID号
DWORDdwIdThis=:
:
GetCurrentProcessId();
//获得这一进程和报告所需的版本,也可以发送0以便指明这一进程
DWORDdwVerReq=:
:
GetProcessVersion(dwIdThis);
WORDwMajorReq=(WORD)(dwVerReq>16);
WORDwMinorReq=(WORD)(dwVerReq&0xffff);
:
:
cout<<"ProcessID:
"< "< : endl; //设置版本信息的数据结构,以便保存操作系统的版本信息 OSVERSIONINFOEXosvix; : : ZeroMemory(&osvix,sizeof(osvix)); osvix.dwOSVersionInfoSize=sizeof(osvix); //提取版本信息和报告 : : GetVersionEx(reinterpret_cast : : cout<<"RunningonOS: "< : endl; //如果是NTS(Windows2000)系统,则提高其优先权 if(osvix.dwPlatformId==VER_PLATFORM_WIN32_NT&&osvix.dwMajorVersion>=5) { //改变优先级 : : SetPriorityClass( : : GetCurrentProcess(),//利用这一进程 HIGH_PRIORITY_CLASS);//改变为high //报告给用户 : : cout<<"TaskManagershouldindicatethis" "processishighpriority."<<: : endl; } } 实验任务: 写出程序运行后的以下几项结果。 当前PID信息5092,requiresOS: 10。 当前操作系统版本6.2。 系统提示信息TaskManagershouldindicatethisprocessishighpriority.。 (3)编程三下面给出了一个终止进程的应用程序(文件名为4-3.cpp),它先创建一个子进程,然后命令它发出“自杀弹”互斥体去终止自身的运行。 阅读该程序并完成实验任务。 #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.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: : cout<<"Creatingthechildprocess."< : endl; : : StartClone(); //暂停 : : Sleep(5000); //指令子进程"杀"掉自身 std: : cout<<"Tellingthechildprocesstoquit."< : endl; : : ReleaseMutex(hMutexSuicide); //消除句柄 : : CloseHandle(hMutexSuicide); } } voidChild() { //打开"自杀"互斥体 HANDLEhMutexSuicide=: : OpenMutex( SYNCHRONIZE,//打开用于同步 FALSE,//不需要向下传递 g_szMutexName);//名称 if(hMutexSuicide! =NULL) { //报告正在等待指令 std: : cout<<"Childwaitingforsuicideinstructions."< : endl; : : WaitForSingleObject(hMutexSuicide,INFINITE); //报告准备好终止,消除句柄 std: : cout<<"Childquitting."< : endl; : : CloseHandle(hMutexSuicide); : : Sleep(1000); } } intmain(intarqc,char*argv[]) { //决定其行为是父进程还是子进程 if(arqc>1&&: : strcmp(argv[1],"child")==0) { Child(); } else { Parent(); } return0; } 分析: 程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。 在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。 当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。 然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。 当调用ExitProcess()时要小心,进程中的所有线程都被立刻通知停止。 在设计应用程序时,必须让主线程在正常的C++运由期关闭(这是由编译器提供默认行为)之后来调用这一函数。 当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。 在正常的终止操作中,进程的每个工作线程都要终止,由主线程序员调用ExitProcess()。 接着,管理层对进程增加的所有对象释放引用,并将用GetExitChodeProcess()建立的退出代码从STILLACTIVE改变为ExitProcess()调用中返回的值。 最后,主线程对象也如同进程对象一样转变为受信状态。 等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。 还没有一种函数可取得终止后的进程对象为其参数,从而使具其“复活”。 当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。 进程可使用退出代码将终止方式通知给调用GetExitCodeProcess()的其他进程。 同时,GetProcessTimes()API函数可向主调者显示 进程的终止时间。 五、总结与体会 通过这次的实验编程,使我对windows的进程创建、终止、控制有了一定的了解,不过对于程序的一些代码我还不是很了解,修改一个程序就要花费很长时间,最终才得以弄出结果。 可见我在程序编程的道路上还有很长的路要走,以后还是要认真学习。 六、教师评语 签名: 日期: 成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 进程 控制