4363998900操作系统实验指导书(版) .doc
《4363998900操作系统实验指导书(版) .doc》由会员分享,可在线阅读,更多相关《4363998900操作系统实验指导书(版) .doc(27页珍藏版)》请在三一办公上搜索。
1、实验一 进程控制与描述一、实验目的通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional、Visual C+ 6.0企业版。三、实验内容和步骤第一部分(共三个程序):Windows 2000 Professional下的GUI应用程序,使用Visual C+编译器创建一个GUI应用程序,代码中包括了
2、WinMain()方法,该方法GUI类型的应用程序的标准入口点。 程序1-1 # include # pragma comment(lib, “user32.lib” ) int APIENTRY WinMain(HINSTANCE/* hInstance */ , HINSTANCE/* hPrevInstance */, LPSTR/* lpCmdLine */, int/* nCmdShow */ ) : MessageBox( NULL, “Hello, Windows 2000” , “Greetings”, MB_OK) ; return(0) ; 在程序1-1的GUI应用程序中,
3、首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL MsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C+ 编译器特有的。接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用G
4、etModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。先分析程序功能,再写出运行结果:_操作系统将当前运
5、行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。程序1-2: 获得和使用进程的句柄 # include # include void main() HANDLE hProcessThis = : GetCurrentProcess() ; DWORD dwPriority = : GetPriorityClass(hProcessTh
6、is) ; std : cout “Current process priority: ” ; switch(dwPriority) case HIGH_PRIORITY_CLASS: std : cout “High” ; break; case NORMAL_PRIORITY_CLASS: std: cout “Normal” ; break; case IDLE_PRIORITY_CLASS: std : cout “Idle” ; break; case REALTIME_PRIORITY_CLASS: std : cout “Realtime” ; break; default: s
7、td : cout “” ; break; std : cout std : endl; 程序1-2中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。先分析程序功能,再写出运行结果:_ _ _ _程序1-
8、3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess() API函数来获得每一个访问进程的进一步信息。程序1-3 利用句柄查出进程的详细信息/ proclist项目# include # include # include DWORD GetKernelModePercentage(const FILETIME & ftKernel, const FILETIME & ftUser) ULONGLONG qwKernel =( ( (ULONGLONG) ftKernel.dwHighDateTime) 32) + ftKernel.dwLowDateTime; ULONGL
9、ONG qwUser =( ( (ULONGLONG) ftUser.dwHighDateTime) 32) + ftUser.dwLowDateTime; ULONGLONG qwTotal = qwKernel + qwUser; DWORD dwPct = (DWORD) ( ( (ULONGLONG) 100*qwKernel) / qwTotal) ; return(dwPct) ; void main() HANDLE hSnapshot = : CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0) ; PROCESSENTRY32 pe
10、; : ZeroMemory(&pe, sizeof(pe) ) ; pe.dwSize = sizeof(pe) ; BOOL bMore = : Process32First(hSnapshot, &pe) ; while(bMore) HANDLE hProcess = : OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID) ; if (hProcess != NULL) FILETIME ftCreation, ftExit, ftKernelMode, ftUserMode; : GetProcessTim
11、es( hProcess, &ftCreation, &ftExit, &ftKernelMode, &ftUserMode) ; DWORD dwPctKernel = : GetKernelModePercentage( ftKernelMode, ftUserMode ) ; std : cout “Process ID: ” pe.th32ProcessID “, EXE file: ” pe.szExeFile “, % in kernel mode: ” dwPctKernel std : endl; : CloseHandle(hProcess) ; bMore = : Proc
12、ess32Next(hSnapshot, &pe) ; 程序1-3程序首先利用Windows 2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。这一结构用来向OpenProcess() API函数提供进程的ID。Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes() API来直询得到有关时间的。接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,清除进程
13、句柄,然后继续循环,直到所有进程都计算过为止。先分析程序功能,再写出运行结果:_ _ _第二部分:进程的“一生”(共三个程序)1、 创建进程创建子进程 # include # include # include void StartClone(int nCloneID) TCHAR szFilenameMAX_PATH ; : GetModuleFileName(NULL, szFilename, MAX_PATH) ; TCHAR szCmdLineMAX_PATH ; : sprintf(szCmdLine, “”%s” %d”, szFilename, nCloneID) ; START
14、UPINFO si; : ZeroMemory(reinterpret_cast (&si) , sizeof(si) ) ; si.cb = sizeof(si) ; PROCESS_INFORMATION pi; BOOL bCreateOK = : CreateProcess( szFilename, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi) ; if (bCreateOK) : CloseHandle(pi.hProcess) ; : CloseHandle(pi.hThread) ;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 4363998900操作系统实验指导书版 4363998900 操作系统 实验 指导书
链接地址:https://www.31ppt.com/p-2888082.html