77范文网 - 专业文章范例文档资料分享平台

操作系统实验指导书(2010秋版)

来源:网络收集 时间:2020-06-19 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

实验一 进程控制与描述

一、实验目的

通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。

二、实验环境

硬件环境:计算机一台,局域网环境;

软件环境:Windows 2000 Professional、Visual C++ 6.0企业版。 三、实验内容和步骤 第一部分(共三个程序):

Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。

程序1-1

# include # pragma comment(lib, “user32.lib” ) int APIENTRY WinMain(HINSTANCE HINSTANCE LPSTR int {

:: MessageBox( NULL, “Hello, Windows 2000” , “Greetings”, MB_OK) ;

/* hInstance */ , /* hPrevInstance */, /* lpCmdLine */, /* nCmdShow */ )

return(0) ; }

在程序1-1的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。

接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL MsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C++ 编译器特有的。

接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。

最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。

先分析程序功能,再写出运行结果:

____________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________

操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。

在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。

程序1-2: 获得和使用进程的句柄

# include # include void main() {

HANDLE hProcessThis = :: GetCurrentProcess() ;

DWORD dwPriority = :: GetPriorityClass(hProcessThis) ; 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:

std :: cout << “” ; break; }

std :: cout << std :: endl; }

程序1-2中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。

OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。

先分析程序功能,再写出运行结果:___________________ ___________________ ________________________________________ ________________________________ __________________________________________________ ______________________

程序1-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; ULONGLONG 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;

:: 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; :: GetProcessTimes( 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 = :: Process32Next(hSnapshot, &pe) ; } }

程序1-3程序首先利用Windows 2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。这一结构用来向OpenProcess() API函数提供进程的ID。Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes() API来直询得到有关时间的。接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继续循环,直到所有进程都计算过为止。

先分析程序功能,再写出运行结果:_____ ___ _______________________________________________________ _________________

第二部分:进程的“一生”(共三个程序)

1、 创建进程 创建子进程

# include # include # include

void StartClone(int nCloneID) {

TCHAR szFilename[MAX_PATH] ;

:: GetModuleFileName(NULL, szFilename, MAX_PATH) ; TCHAR szCmdLine[MAX_PATH] ;

:: sprintf(szCmdLine, “\\”%s\\” %d”, szFilename, nCloneID) ; STARTUPINFO 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) ; }}

int main(int argc, char* argv[] ) {

int nClone(0) ; if (argc > 1)

{ :: sscanf(argv[1] , “%d” , &nClone) ;}

std :: cout << “Process ID: “ << :: GetCurrentProcessId() << “, Clone ID: “ << nClone << std :: endl;

const int c_nCloneMax = 25; if (nClone < c_nCloneMax) {

StartClone(++nClone) ; }

:: Sleep(500) ;

return 0; }

本程序展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:

________________________________________________________________________ 标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。

CreateProcess() 函数有________个核心参数?本实验程序中设置的各个参数的值是: a. _________________________________________________; b. _________________________________________________; c. _________________________________________________; d. _________________________________________________; e. _________________________________________________; 程序运行时屏幕显示的信息是:

____________________________________________________________________ ________________________________________________________________________ 2、 正在运行的进程

使用进程和操作系统的版本信息

// version项目

# include # include void main() {

DWORD dwIdThis = :: GetCurrentProcessId() ;

DWORD dwVerReq = :: GetProcessVersion(dwIdThis) ; WORD wMajorReq =( (WORD) dwVerReq > 16) ; WORD wMinorReq = ((WORD) dwVerReq & 0xffff) ; std :: cout << “Process ID: “ << dwIdThis

<< “, requires OS: “ << wMajorReq << wMinorReq << std :: endl ; OSVERSIONINFOEX osvix;

:: ZeroMemory(&osvix, sizeof(osvix) ) ; osvix.dwOSVersionInfoSize = sizeof(osvix) ;

:: GetVersionEx(reinterpret_cast < LPOSVERSIONINFO > (&osvix) ) ; std :: cout << “Running on OS: “ << osvix.dwMajorVersion << “.” << osvix.dwMinorVersion << std :: endl;

if (osvix.dwPlatformId == VER_PLATFORM_WIN32_NT && osvix.dwMajorVersion >= 5) {

:: SetPriorityClass(

:: GetCurrentProcess() , HIGH_PRIORITY_CLASS) ;

std :: cout << “Task Manager should now now indicate this” “process is high priority.” << std :: endl; } }

分析程序,写出运行结果:

当前PID信息:______________________________________________________ 当前操作系统版本:__________________________________________________ 系统提示信息:______________________________________________________ _______________________________________________________________________

程序向读者表明了如何获得当前的PID和所需的进程版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。

接着,程序演示了如何使用GetVersionEx() API函数来提取OSVERSIONINFOEX结构。这一数据块中包括了操作系统的版本信息。其中,“OS : 5.0”表示当前运行的操作系统是:

____________________________________________________________________ 最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。

单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。

在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是 (为什么?) :

____________________________________________________________________

右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗?为什么?

____________________________________________________________________ ________________________________________________________________________ 3、 终止进程

指令其子进程来“杀掉”自己的父进程

// procterm项目

# include # include # include

static LPCTSTR g_szMutexName = “w2kdg.ProcTerm.mutex.Suicide” ; void StartClone() {

TCHAR szFilename [MAX_PATH] ;

:: GetModuleFileName(NULL, szFilename, MAX_PATH) ; TCHAR szCmdLine[MAX_PATH] ;

:: sprintf(szCmdLine, “\\” %s\\“ child” , szFilename) ; STARTUPINFO si;

:: ZeroMemory(reinterpret_cast < void* > (&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) ;} }

void Parent()

{ HANDLE hMutexSuicide = :: CreateMutex( NULL,

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统实验指导书(2010秋版)在线全文阅读。

操作系统实验指导书(2010秋版).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/1110553.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: