试验一进程控制与描述.docx
- 文档编号:24880311
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:16
- 大小:21.66KB
试验一进程控制与描述.docx
《试验一进程控制与描述.docx》由会员分享,可在线阅读,更多相关《试验一进程控制与描述.docx(16页珍藏版)》请在冰豆网上搜索。
试验一进程控制与描述
实验一进程控制与描述
一、实验目的
通过对Windows2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows2000的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows2000中进程的“一生”。
二、实验环境
硬件环境:
计算机一台,局域网环境;
软件环境:
Windows2000Professional、VisualC++6.0企业版。
三、实验内容和步骤
第一部分(共三个程序):
Windows2000Professional下的GUI应用程序,使用VisualC++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。
程序1-1
#include
#pragmacomment(lib,“user32.lib”)
intAPIENTRYWinMain(HINSTANCE/*hInstance*/,
HINSTANCE/*hPrevInstance*/,
LPSTR/*lpCmdLine*/,
int/*nCmdShow*/)
{
:
:
MessageBox(
NULL,
“Hello,Windows2000”,
“Greetings”,
MB_OK);
return(0);}
在程序1-1的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain()和MessageBox()API函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。
这样就可以运行简单的命令行命令CLMsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox()API函数就成为未定义的了。
这一指令是VisualStudioC++编译器特有的。
接下来是WinMain()方法。
其中有四个由实际的低级入口点传递来的参数。
hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle()API函数将这些资源提取出来。
系统利用实例句柄来指明代码和初始的数据装在内存的何处。
句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。
下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。
应用程序的命令行(不包括程序的名称)是lpCmdLine参数。
另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口(选项包括最小化、最大化和正常)。
最后,程序调用MessageBox()API函数并退出。
如果在进入消息循环之前就结束运行的话,最后必须返回0。
先分析程序功能,再写出运行结果:
____________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
操作系统将当前运行的应用程序看作是进程对象。
利用系统提供的惟一的称为句柄(HANDLE)的号码,就可与进程对象交互。
这一号码只对当前进程有效。
在系统中运行的任何进程都可调用GetCurrentProcess()API函数,此函数可返回标识进程本身的句柄。
然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。
程序1-2:
获得和使用进程的句柄
#include
#include
voidmain()
{
HANDLEhProcessThis=:
:
GetCurrentProcess();
DWORDdwPriority=:
:
GetPriorityClass(hProcessThis);
std:
:
cout<<“Currentprocesspriority:
”;
switch(dwPriority)
{
caseHIGH_PRIORITY_CLASS:
std:
:
cout<<“High”;
break;
caseNORMAL_PRIORITY_CLASS:
std :
:
cout<< “Normal”;
break;
caseIDLE_PRIORITY_CLASS:
std:
:
cout<<“Idle”;
break;
caseREALTIME_PRIORITY_CLASS:
std:
:
cout<<“Realtime”;
break;
default:
std:
:
cout<<“
break;
}
std:
:
cout< : endl; } 程序1-2中列出的是一种获得进程句柄的方法。 对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass()API函数的调用那样。 在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。 OpenProcess()和CreateProcess()API函数也可以用于提取进程句柄。 前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。 先分析程序功能,再写出运行结果: ______________________________________ ________________________________________________________________________ ________________________________________________________________________ 程序1-3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess()API函数来获得每一个访问进程的进一步信息。 程序1-3利用句柄查出进程的详细信息 //proclist项目 #include #include #include DWORDGetKernelModePercentage(constFILETIME&ftKernel, constFILETIME&ftUser) { ULONGLONGqwKernel= (((ULONGLONG)ftKernel.dwHighDateTime)<<32)+ ftKernel.dwLowDateTime; ULONGLONGqwUser= (((ULONGLONG)ftUser.dwHighDateTime)<<32)+ ftUser.dwLowDateTime; ULONGLONGqwTotal=qwKernel+qwUser; DWORDdwPct= (DWORD)(((ULONGLONG)100*qwKernel)/qwTotal); return(dwPct); } voidmain() { HANDLEhSnapshot=: : CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0); PROCESSENTRY32pe; : : ZeroMemory(&pe,sizeof(pe)); pe.dwSize=sizeof(pe); BOOLbMore=: : Process32First(hSnapshot,&pe); while(bMore) { HANDLEhProcess=: : OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID); if(hProcess! =NULL) {FILETIMEftCreation,ftExit,ftKernelMode,ftUserMode; : : GetProcessTimes( hProcess, &ftCreation, &ftExit, &ftKernelMode, &ftUserMode); DWORDdwPctKernel=: : GetKernelModePercentage( ftKernelMode, ftUserMode); std: : cout<<“ProcessID: ”< <<“,EXEfile: ”< <<“,%inkernelmode: ”< < : endl; : : CloseHandle(hProcess); } bMore=: : Process32Next(hSnapshot,&pe);} } 程序1-3程序首先利用Windows2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。 然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。 这一结构用来向OpenProcess()API函数提供进程的ID。 Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes()API来直询得到有关时间的。 接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。 程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继续循环,直到所有进程都计算过为止。 先分析程序功能,再写出运行结果: ________ ________________________________________________________________________ 第二部分: 进程的“一生”(共三个程序) 1、创建进程 创建子进程 #include #include #include voidStartClone(intnCloneID) { TCHARszFilename[MAX_PATH]; : : GetModuleFileName(NULL,szFilename,MAX_PATH); TCHARszCmdLine[MAX_PATH]; : : sprintf(szCmdLine,“\”%s\”%d”,szFilename,nCloneID); STARTUPINFOsi; : : ZeroMemory(reinterpret_cast si.cb=sizeof(si); PROCESS_INFORMATIONpi; BOOLbCreateOK=: : CreateProcess( szFilename, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); if(bCreateOK) {: : CloseHandle(pi.hProcess); : : CloseHandle(pi.hThread); }} intmain(intargc,char*argv[]) { intnClone(0); if(argc>1) {: : sscanf(argv[1],“%d”,&nClone);} std: : cout<<“ProcessID: “<<: : GetCurrentProcessId() <<“,CloneID: “< < : endl; constintc_nCloneMax=25; if(nClone { StartClone(++nClone); } : : Sleep(500); return0; } 本程序展示的是一个简单的使用CreateProcess()API函数的例子。 首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。 大多数参数都可取缺省值,但是创建标志参数使用了: ________________________________________________________________________ 标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。 然后该克隆进程的创建方法关闭传递过来的句柄并返回main()函数。 在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。 CreateProcess()函数有________个核心参数? 本实验程序中设置的各个参数的值是: a._________________________________________________; b._________________________________________________; c._________________________________________________; d._________________________________________________; e._________________________________________________; 程序运行时屏幕显示的信息是: ____________________________________________________________________ ________________________________________________________________________ 2、正在运行的进程 使用进程和操作系统的版本信息 //version项目 #include #include voidmain() { DWORDdwIdThis=: : GetCurrentProcessId(); DWORDdwVerReq=: : GetProcessVersion(dwIdThis); WORDwMajorReq=((WORD)dwVerReq>16); WORDwMinorReq=((WORD)dwVerReq&0xffff); std: : cout<<“ProcessID: “< <<“,requiresOS: “< : endl ; OSVERSIONINFOEXosvix; : : ZeroMemory(&osvix,sizeof(osvix)); osvix.dwOSVersionInfoSize=sizeof(osvix); : : GetVersionEx(reinterpret_cast std: : cout<<“RunningonOS: “< < : endl; if(osvix.dwPlatformId==VER_PLATFORM_WIN32_NT&& osvix.dwMajorVersion>=5) { : : SetPriorityClass( : : GetCurrentProcess(), HIGH_PRIORITY_CLASS); std: : cout<<“TaskManagershouldnownowindicatethis” “processishighpriority.”< : endl; } } 分析程序,写出运行结果: 当前PID信息: ______________________________________________________ 当前操作系统版本: __________________________________________________ 系统提示信息: ______________________________________________________ _______________________________________________________________________ 程序向读者表明了如何获得当前的PID和所需的进程版本信息。 为了运行这一程序,系统处理了所有的版本不兼容问题。 接着,程序演示了如何使用GetVersionEx()API函数来提取OSVERSIONINFOEX结构。 这一数据块中包括了操作系统的版本信息。 其中,“OS: 5.0”表示当前运行的操作系统是: ____________________________________________________________________ 最后一段程序利用了操作系统的版本信息,以确认运行的是Windows2000。 代码接着将当前进程的优先级提高到比正常级别高。 单击Ctrl+Alt+Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。 在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是(为什么? ): ____________________________________________________________________ 右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗? 为什么? ____________________________________________________________________ ________________________________________________________________________ 3、终止进程 指令其子进程来“杀掉”自己的父进程 //procterm项目 #include #include #include staticLPCTSTRg_szMutexName=“w2kdg.ProcTerm.mutex.Suicide”; voidStartClone() { TCHARszFilename[MAX_PATH]; : : GetModuleFileName(NULL,szFilename,MAX_PATH); TCHARszCmdLine[MAX_PATH]; : : sprintf(szCmdLine,“\”%s\“child”,szFilename); STARTUPINFOsi; : : ZeroMemory(reinterpret_cast si.cb=sizeof(si); PROCESS_INFORMATIONpi; BOOLbCreateOK=: : CreateProcess( szFilename, 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(hMutexSui
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 试验 进程 控制 描述