操作系统实验报告4_第1页
操作系统实验报告4_第2页
操作系统实验报告4_第3页
操作系统实验报告4_第4页
操作系统实验报告4_第5页
免费预览已结束,剩余12页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《操作系统》实验报告实验序号: 4实验项目名称:进程控制学 号1207122219姓 名实验序号: 4实验项目名称:进程控制学 号1207122219姓 名邝沃佳实验地点1-418指导教师李远敏专业、班实验时间软金二班2014/10/21实验目的及要求通过对WindowsXP进行编程,来熟悉和了解系统。通过分析程序,来了解进程的创建、终止。二、 实验设备(环境)及要求一台WindowsXP操作系统的计算机。计算机装有MicrosoftVisualStudioC++6.0专业版或企业版。•CreateProcess()调用:创建一个进程。•ExitProcess()调用:终止一个进程。三、 实验内容与步骤(1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序 (mspaint.exe)。阅读该程序,完成实验任务。源程序如下:include<stdio.h>include<windows.h>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;}WaitForSinqleObject(pi.hProcess,INFINITE);Printf(“hildComplete”);CloseHandle(pi.hProcess);CloseHandle(pihThread);}IIglobalEEmbEir二.ntain +戛〒翳回Jrj,nincliide<Gtdio.h>Uincl>ude<Nindovs,h>intnain(UOlOi)<STARTUPIHrOsi;PFtOCESSlNFDRHATlDINpi;^ernMenorijjffisi.sizeof(si));si.cb=sizeof(si);■ZertibipnoFy(£rpi ;if(?CreateProcess(NULL,^c:\XWJHD0VS\\si_istpini32\\inspaiiitaexeh\HOLL,NULL.FALSE#rmi叫修改后:#inelude<stdio.h>#include<windows.h>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);}在"命令提示符"窗口运行 CL命令产生可执行程序 4-1.exe:C:\>CL4-1.cpp

C:X>cdtestC:\tesc>cltest.cddmcrnsnFtIR)12-bit +OptimizingConpilnrUrminn12 AH RHhR^MirpflTflFfcCorp1984-1^9ft.Al1piaKti .fcotxt-cpptcat_cpp<27>:warningrC^715:*mainJ:neta1)cui^ti'ol^athsrctui'navalueMitrwiufL<H>[iiLrciieMtdlLinherUeruiuH6,00,016#CuiJijrlyhL<C>HlcrusufCCurpl?92-i?9B.AllrlyhbxresErued.<ont:test.exetc&t.oJbjC:\tesc>_实验任务:写出程序的运行结果。'?■未命名-盲圈 口回I*'?■未命名-盲圈 口回I*文件0)编辑⑥查看F團像①频色©帮助⑩11111111miningCompilevUgpsion12・0E84-丄9¥呂・A11pightsreserved.malnJ:notallcontro1pathsrUepsion6.00.816892-1V98・Allrightsreserued.要義得帮助」请在强帮助”菜单中,单击C:Xtest>test_exe4.正在运行的进程(2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序 (文件名为4-5.cpp)。它利用进程信息查询的 API函数GetProcessVersion() 与GetVersionEx()的共同作用。确定运行进程的操作系统版本号。阅读该程序并完成实验任务。#include<windows.h>#include<iostream>//利用进程和操作系统的版本信息的简单示例Voidmain(){//提取这个进程的ID号DWORDdwldThis=::GetCurrentProcessld();〃获得这一进程和报告所需的版本,也可以发送 0以便指明这一进程DWORDdwVerReq=::GetProcessVersion(dwldThis);WORDwMajorReq=::(WORD)dwVerReq>16);WORDwMinorReq=::(WORD)dwVerReq&oxfff);std::cout<< ”ProcessID:”<<dwldThis< ”,requiresOS:”<<wMajorReq<<wMinorReq<<std::endl;//设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEXosvix;::ZeroMemory(&osvix,sizeof(osvix));Osvix.dwOSVersionInfoSize=sizeof(osvix);//提取版本信息和报告::GetVersionEx(reinterpretcast<LPOSVERSIONINFO>(&osvix));Std::cout<< ”RunningonOS:”<<osvix.dwMajorVersion<< ”.'<osvix.dwMinorVersion<<std::endl;//如果是NTS(Windows2000)系统,则提高其优先权If(osvix.dwPlatformld==VERPLATFORMWIN32NT&&Osvix.dwMajorVersion>=5{//改变优先级::SerPriorityClass(::GetCurrentProcess() 〃利用这一进程HIGHPRIORITYCLASS); 〃改变为high//报告给用户Std::cout<<"TaskManagershouldnownowindicatethis”processishighpriority."<<std::endl;}}|| - |T . ■ttinclude<uindous.^>Xliiciude<lustredii>"利用进程和操作系统的版本信息的简单示例»oldmaln(){"提瑕逸昨泄程旳」•号DWORDduI<lThis=::GetCurrentProcessld();"荻得这一进程和报告所需的版本,也可以发学以便指明这一进程DUORDdviU^rReq=::GetProce^sUerEionfduIdThis);WORDvjHajQrReq=((W0RD)dvVerReq>16);UQRDwninarReq=((WORD)dvUerReq&axfFfF);std::cout«alProcessID:"«dwIdThis«"frequiresOS:M«uHajorHeq«wHinorReg«std::endl;"i殳置皈本信息的数据结枸,以便保存換作系统飲版本信息修改后:#include<windows.h>#include<iostream>//利用进程和操作系统的版本信息的简单示例voidmain(){〃提取这个进程的ID号DWORDdwldThis=::GetCurrentProcessld();〃获得这一进程和报告所需的版本,也可以发送 0以便指明这一进程DWORDdwVerReq=::GetProcessVersion(dwldThis);WORDwMajorReq=((WORD)dwVerReq>16);WORDwMinorReq=((WORD)dwVerReq&0xffff);std::cout<<"ProcessID:"<<dwIdThis<<",requiresOS:"<<wMajorReq<<wMinorReq<<std::endl;//设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEXosvix;::ZeroMemory(&osvix,sizeof(osvix));osvix.dwOSVersionInfoSize=sizeof(osvix);〃提取版本信息和报告::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));std::cout<<"RunningonOS:"<<osvix.dwMajorVersion<<"."<<osvix.dwMinorVersion<<std::endl;//如果是NTS(Windows2000)系统,则提高其优先权if(osvix.dwPlatformld==VER_PLATFORM_WIN32_NT&&osvix.dwMajorVersion>=5){〃改变优先级::SetPriorityClass(::GetCurrentProcess(), //利用这一进程HIGH_PRIORITY_CLASS); //改变为high〃报告给用户std::cout<<"TaskManagershouldnownowindicatethis"

实验任务。#include<windows.h>#include<iostream>#include<stdio.h>saticLPCTSTRg_szMutexName="w2kdg.ProcTerm.mutex.Suicide”//创建当前进程的克隆进程的简单方法VoidStartClone(){//提取当前可执行文件的文件名TCHARszFilename 〔MAXPATH〕::GetModuleFileName(NULL,szFilename,MAXPATH);//格式化用于子进程的命令行,指明它是一个 EXE文件和子进程TCHARszCmdLine〔MAXPATH〕;::sprintf(szCmdLine, ”” ”child”,szFilename);//子进程的启动信息结构STARTUPINFOsi;::ZeroMemory(reinterpretcast<void*>(&si),sizeof(si));si.cb=sizeof(si); // 应当是此结构的大小//返回的用于子进程的进程信息PROCESSINFORMATIONpi;//用同样的可执行文件名和命令行创建进程,并指明它是一个子进程BOOLbCreateOK=::CreateProcess(SzFilename,SzCmdLine,NULL,NULL,FALSE,//////////CREATENEWCONSOLE,NULL,SzFilename,SzCmdLine,NULL,NULL,FALSE,//////////CREATENEWCONSOLE,NULL,NULL,&si,&pi);////////产生的应用程序名称(本EXE文件)告诉人们这是一个子进程的标志用于进程的默认的安全性用于线程的默认安全性不继承句柄// 创建新窗口,使输出更直观新环境当前目录启动信息结构返回的进程的信息//释放指向子进程的引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}VoidParent(){//创建“自杀”互斥程序体HANDLEhMutexSuicide=::CreatgeMutex(NULL//TRUE ,gszMutexName);

if(hMutexSuicide!=NULL)//创建子进程std::cout<< ”::StartClone();//暂停::sleep(5000);////默认的安全性最初拥有的为其命名Creatingthechildprocess.”<<std::endl;“杀”掉自身”Tellingthechildprocesstoquit.::ReleaseMutex(hMutexSuicide);// 指令子进程std::cout<<// 消除句柄::CloseHandle(hMutexSuicide);}VoidChild(){〃打开“自杀”互斥体HANDLEhMutexSuicide=::OpenMutex(SYNCHRONIZE,FALSE,gszMutexName);if(hMutexSuicide!=NULL){II打开用于同步//不需要向下传递II名称”<<std::endl;//报告正在等待指令Std::cout<<"Childwaitingforsuicideinstructions."”<std::endl;::WaitForSingleObject(hMutexSuicide,INFINITE);报告准备好终止,消除句柄”Childquiting.”<<std::endl;::CloseHandle(hMutexSuicide);::sleep(1000);}//Std:cout<<intmain(intarqc,char*argv 〔〕){//决定其行为是父进程还是子进程if(argc>1&&::strcmp(argv 〔1〕,”child”)==0){Child();}else{Parent();}Return0;}仃(AllglobalmembEriE▼(Globals)main亘★筋隘仃(AllglobalmembEriE▼(Globals)main+剧3classesttinclude<uindDU5+剧3classesffinclude<iostream>wlnciude<stdio.h>staticLPCTSTRy_szllutexHane-"u2kdg.Proc*rerm.mutew.Suicide4"创建当前进程的克隆逬程的简单方祛uoidStartCLone(){/殛取当前可执行文件的文件名TChARSZFllenamp[HAX_rATH];::GetNodUlEFilet1aiie(NULL,5zFileiiaiw^MAXPATH);/術式化埔于子进程的命令行.指明它是一个EJ(E文件和子进程TCHARszCmdLine[MAX_PflTH]:::sprintF(szCndLinef"\"^s\"child";"子进程的信动信息結构STARTUPINFOsi;hI2Sl|- Cunfiguration:3-lfin32Debug—— Linking…3.exe-0error(s),nviarning(s)修改后:#include<windows.h>#include<iostream>#include<stdio.h>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<void*>(&si),sizeof(si));si.cb=sizeof(si); //应当是此结构的大小//返回的用于子进程的进程信息PROCESS_INFORMATIONpi;//用同样的可执行文件名和命令行创建进程,并指明它是一个子进程BOOLbCreateOK=::CreateProcess(szFilename, //产生的应用程序名称(本EXE文件)szCmdLine, 〃告诉人们这是一个子进程的标志NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);//释放指向子进程的引用if(bCreateOK)//用于进程的默认的安全性〃用于线程的默认安全性//不继承句柄//创建新窗口,使输出更直观//新环境//当前目录〃启动信息结构〃返回的进程的信息{::CloseHandle(pi.hProcess);::{::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}voidParent(){//创建“自杀”互斥程序体HANDLEhMutexSuicide=::CreateMutex(NULL, 〃默认的安全性TRUE, 〃最初拥有的g_szMutexName); //为其命名if(hMutexSuicide!=NULL){//创建子进程std::cout<<"Creatingthechildprocess."<<std::endl;::StartClone();〃暂停::Sleep(5000);//指令子进程“杀”掉自身std::cout<<"Tellingthechildprocesstoquit."<<std::endl;::ReleaseMutex(hMutexSuicide);〃消除句柄::CloseHandle(hMutexSuicide);}}voidChild(){〃打开“自杀”互斥体//打开用于同步//打开用于同步//不需要向下传递//名称SYNCHRONIZE,FALSE,g_szMutexName);if(hMutexSuicide!=NULL){//报告正在等待指令std::cout<<"Childwaitingforsuicideinstructions."<<std::endl;::WaitForSingleObject(hMutexSuicide,INFINITE);//报告准备好终止,消除句柄std::cout<<"Childquiting."<<std::endl;::CloseHandle(hMutexSuicide);::Sleep(1000);}}intmain(intargc,char*argv[]){//决定其行为是父进程还是子进程if(argc>1&&::strcmp(argv[1],"child")==0){Child();}else{Parent();}return0;}分析:程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论