操作系统实验报告4_第1页
操作系统实验报告4_第2页
操作系统实验报告4_第3页
操作系统实验报告4_第4页
操作系统实验报告4_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统 实验报告实验序号:4实验项目名称:进程控制学号1207122219姓名邝沃佳专业、班软金二班实验地点1-418指导教师李远敏实验时间2014/10/21一、 实验目的及要求(1) 通过对WindowsXP进行编程,来熟悉和了解系统。(2) 通过分析程序,来了解进程的创建、终止。二、实验设备(环境)及要求(1) 一台WindowsXP操作系统的计算机。(2) 计算机装有Microsoft Visual Studio C+6.0专业版或企业版。(3) CreateProcess()调用:创建一个进程。(4) ExitProcess()调用:终止一个进程。三、实验内容与步骤(1)编程一 利

2、用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。阅读该程序,完成实验任务。源程序如下: # include # include int main(VOID) STARTUPINFO si; PROCESS INFORMATION pi; ZeroMemory(&si,sizeof(si); Si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi); if(!CreateProcess(NULL, “c: WINDOWSsystem32 mspaint.exe”, NULL, NULL, FALSE, 0, NULL,

3、NULL, &si,&pi) fprintf(stderr,”Creat Process Failed”);return 1;WaitForSingleObject(pi.hProcess,INFINITE);Printf(“child Complete”);CloseHandle(pi.hProcess);CloseHandle(pi hThread); 修改后:#include #include int main(VOID) STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si,sizeof(si);si.cb=sizeof(si);Ze

4、roMemory(&pi,sizeof(pi);if(!CreateProcess(NULL,c:WINDOWSsystem32mspaint.exe, NULL,NULL,FALSE,0,NULL, NULL,&si,&pi)fprintf(stderr,Creat Process Failed);return -1; WaitForSingleObject(pi.hProcess,INFINITE);printf(child Complete);CloseHandle(pi.hProcess);CloseHandle(pi.hThread); 在“命令提示符”窗口运行CL命令产生可执行程序

5、4-1.exe: C: CL 4-1.cpp 实验任务:写出程序的运行结果。 4正在运行的进程 (2)、编程二 下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。确定运行进程的操作系统版本号。阅读该程序并完成实验任务。 #include #include/利用进程和操作系统的版本信息的简单示例Void main() /提取这个进程的ID号 DWORD dwIdThis=:GetCurrentProcessId(); /获得这一进程和报告所需的版本,也可以发送0

6、以便指明这一进程DWORD dwVerReq=:GetProcessVersion(dwIdThis);WORD wMajorReq=:(WORD)dwVerReq16);WORD wMinorReq=:(WORD)dwVerReq & oxffff);std:cout ”Process ID:” dwIdThis ”,requires OS:” wMajorReq wMinorReq std:endl;/设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEX osvix;:ZeroMemory(&osvix,sizeof(osvix);Osvix.dwOSVersi

7、onInfoSize=sizeof(osvix);/提取版本信息和报告:GetVersionEx(reinterpret cast(&osvix);Std:cout ”Running on OS:” osvix.dwMajorVersion ”.” osvix.dwMinorVersion =5 /改变优先级:SerPriorityClass(:GetCurrentProcess() /利用这一进程 HIGH PRIORITY CLASS); /改变为high/报告给用户Std:cout ”Task Manager should now now indicate this” “process

8、is high priority.” std:endl;修改后:#include#include/利用进程和操作系统的版本信息的简单示例void main()/提取这个进程的ID号DWORD dwIdThis=:GetCurrentProcessId();/获得这一进程和报告所需的版本,也可以发送0以便指明这一进程DWORD dwVerReq=:GetProcessVersion(dwIdThis);WORD wMajorReq=(WORD)dwVerReq16);WORD wMinorReq=(WORD)dwVerReq&0xffff);std:coutProcess ID:dwIdThis

9、 ,requires OS:wMajorReqwMinorReqstd:endl;/设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEX osvix;:ZeroMemory(&osvix,sizeof(osvix);osvix.dwOSVersionInfoSize=sizeof(osvix);/提取版本信息和报告:GetVersionEx(reinterpret_cast(&osvix);std:coutRunning on OS:osvix.dwMajorVersion.osvix.dwMinorVersion=5)/改变优先级:SetPriorityClass

10、(:GetCurrentProcess(), /利用这一进程HIGH_PRIORITY_CLASS); /改变为high/报告给用户std:coutTask Manager should now now indicate thisprocess is high priority.std:endl;实验参考:在Visual C+窗口的工具栏中单击“打开”按钮,在“打开“对话框中找到并打开4-2.cpp源程序。单击Build菜单中的Compile 4-2.cpp命令,再单击“是”按钮确认。系统对4-2.cpp源程序进行编译。编译完成后,单击Build菜单中的Build 4-2.exe命令,建立4-

11、2.exe可执行文件。在工具栏单击Execute Program(执行程序)按钮,执行4-2.exe程序。实验任务:写出程序运行后的以下几项结果。当前PID信息 1628 。当前操作系统版本 Running on OS:5.1 。系统提示信息 Task Manager should now now indicate thisprocess is high priority 。5、终止进程(3)编程三 下面给出了一个终止进程的应用程序(文件名为4-3.cpp),它先创建一个子进程,然后命令它发出“自杀弹”互斥体去终止自身的运行。阅读该程序并完成实验任务。 #include #include #i

12、nclude satic LPCTSTR g szMutexName=”w2kdg.ProcTerm.mutex.Suicide”;/创建当前进程的克隆进程的简单方法Void StartClone() /提取当前可执行文件的文件名 TCHAR szFilenameMAX PATH :GetModuleFileName(NULL,szFilename,MAX PATH); /格式化用于子进程的命令行,指明它是一个EXE文件和子进程 TCHAR szCmdLineMAX PATH; :sprintf(szCmdLine,”%s”child”,szFilename); /子进程的启动信息结构 STA

13、RTUPINFO si; :ZeroMemory(reinterpret cast(&si),sizeof(si); si.cb=sizeof(si); /应当是此结构的大小 /返回的用于子进程的进程信息 PROCESS INFORMATION pi; /用同样的可执行文件名和命令行创建进程,并指明它是一个子进程 BOOL bCreateOK=:CreateProcess( SzFilename, /产生的应用程序名称(本EXE文件) SzCmdLine, /告诉人们这是一个子进程的标志 NULL, /用于进程的默认的安全性 NULL, /用于线程的默认安全性 FALSE, /不继承句柄 CR

14、EATE NEW CONSOLE, /创建新窗口,使输出更直观 NULL, /新环境 NULL, /当前目录 &si, /启动信息结构 &pi); /返回的进程的信息 /释放指向子进程的引用 if(bCreateOK) :CloseHandle(pi.hProcess); :CloseHandle(pi.hThread); Void Parent() /创建“自杀”互斥程序体 HANDLE hMutexSuicide=:CreatgeMutex( NULL, /默认的安全性 TRUE, /最初拥有的 g szMutexName); /为其命名 if(hMutexSuicide !=NULL)

15、/创建子进程 std:cout ”Creating the child process.” std : endl; :StartClone(); /暂停 :sleep(5000); /指令子进程“杀”掉自身 std:cout ”Telling the child process to quit.” std:endl; :ReleaseMutex(hMutexSuicide); /消除句柄 :CloseHandle(hMutexSuicide); Void Child() /打开“自杀”互斥体 HANDLE hMutexSuicide=:OpenMutex( SYNCHRONIZE, /打开用于

16、同步 FALSE, /不需要向下传递 g szMutexName); /名称 if ( hMutexSuicide !=NULL) /报告正在等待指令 Std:cout ”Child waiting for suicide instructions.” std:endl; :WaitForSingleObject(hMutexSuicide,INFINITE); /报告准备好终止,消除句柄 Std:cout ”Child quiting.” 1 & & :strcmp(argv1,”child”)=0) Child(); else Parent(); Return 0; 修改后:#includ

17、e #include #include static LPCTSTR g_szMutexName=w2kdg.ProcTerm.mutex.Suicide;/创建当前进程的克隆进程的简单方法void StartClone() /提取当前可执行文件的文件名 TCHAR szFilenameMAX_PATH; :GetModuleFileName(NULL,szFilename,MAX_PATH); /格式化用于子进程的命令行,指明它是一个EXE文件和子进程 TCHAR szCmdLineMAX_PATH; :sprintf(szCmdLine,%schild,szFilename); /子进程的

18、启动信息结构 STARTUPINFO si; :ZeroMemory(reinterpret_cast(&si),sizeof(si); si.cb=sizeof(si); /应当是此结构的大小 /返回的用于子进程的进程信息 PROCESS_INFORMATION pi; /用同样的可执行文件名和命令行创建进程,并指明它是一个子进程 BOOL bCreateOK=:CreateProcess( szFilename, /产生的应用程序名称(本EXE文件) szCmdLine, /告诉人们这是一个子进程的标志 NULL, /用于进程的默认的安全性 NULL, /用于线程的默认安全性 FALSE,

19、 /不继承句柄 CREATE_NEW_CONSOLE, /创建新窗口,使输出更直观 NULL, /新环境 NULL, /当前目录 &si, /启动信息结构 &pi); /返回的进程的信息 /释放指向子进程的引用 if(bCreateOK) :CloseHandle(pi.hProcess); :CloseHandle(pi.hThread); void Parent() /创建“自杀”互斥程序体 HANDLE hMutexSuicide=:CreateMutex( NULL, /默认的安全性 TRUE, /最初拥有的 g_szMutexName); /为其命名 if(hMutexSuicide

20、 !=NULL) /创建子进程 std:coutCreating the child process.std:endl; :StartClone(); /暂停 :Sleep(5000); /指令子进程“杀”掉自身 std:coutTelling the child process to quit.std:endl; :ReleaseMutex(hMutexSuicide); /消除句柄 :CloseHandle(hMutexSuicide); void Child() /打开“自杀”互斥体 HANDLE hMutexSuicide=:OpenMutex( SYNCHRONIZE, /打开用于同

21、步 FALSE, /不需要向下传递 g_szMutexName); /名称 if ( hMutexSuicide !=NULL) /报告正在等待指令 std:coutChild waiting for suicide instructions.std:endl; :WaitForSingleObject(hMutexSuicide,INFINITE); /报告准备好终止,消除句柄 std:coutChild quiting.1&:strcmp(argv1,child)=0) Child(); else Parent(); return 0; 分析:程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。然后用Slee

温馨提示

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

评论

0/150

提交评论