操作系统原理实验四文档格式.docx

上传人:b****6 文档编号:15975502 上传时间:2022-11-17 格式:DOCX 页数:8 大小:18.12KB
下载 相关 举报
操作系统原理实验四文档格式.docx_第1页
第1页 / 共8页
操作系统原理实验四文档格式.docx_第2页
第2页 / 共8页
操作系统原理实验四文档格式.docx_第3页
第3页 / 共8页
操作系统原理实验四文档格式.docx_第4页
第4页 / 共8页
操作系统原理实验四文档格式.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

操作系统原理实验四文档格式.docx

《操作系统原理实验四文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统原理实验四文档格式.docx(8页珍藏版)》请在冰豆网上搜索。

操作系统原理实验四文档格式.docx

intmain(VOID)

﹛STARTUPINFOsi;

PROCESSINFORMATIONpi;

ZeroMemory(&

si,sizeof(si));

Si.cb=sizeof(si);

pi,sizeof(pi));

if(!

CreateProcess(NULL,

“c:

\WINDOWS\system32\mspaint.exe”,

NULL,

FALSE,

0,

NULL,

&

si,&

pi))

﹛fprintf(stderr,”CreatProcessFailed”);

return—1;

WaitForSingleObject(pi.hProcess,INFINITE);

Printf(“childComplete”);

CloseHandle(pi.hProcess);

CloseHandle(pihThread);

在“命令提示符”窗口运行CL命令产生可执行程序4-1.exe:

C:

\>

CL4-1.cpp

实验任务:

写出程序的运行结果。

4.正在运行的进程

(2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。

它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。

确定运行进程的操作系统版本号。

阅读该程序并完成实验任务。

#include<

windows.h>

iostream>

//利用进程和操作系统的版本信息的简单示例

Voidmain()

//提取这个进程的ID号

DWORDdwIdThis=:

:

GetCurrentProcessId();

//获得这一进程和报告所需的版本,也可以发送0以便指明这一进程

DWORDdwVerReq=:

GetProcessVersion(dwIdThis);

WORDwMajorReq=:

(WORD)dwVerReq>

16);

WORDwMinorReq=:

(WORD)dwVerReq&

oxffff);

std:

cout<

<

”ProcessID:

”<

dwIdThis

”,requiresOS:

wMajorReq<

wMinorReq<

endl;

//设置版本信息的数据结构,以便保存操作系统的版本信息

OSVERSIONINFOEXosvix;

ZeroMemory(&

osvix,sizeof(osvix));

Osvix.dwOSVersionInfoSize=sizeof(osvix);

//提取版本信息和报告

GetVersionEx(reinterpretcast<

LPOSVERSIONINFO>

(&

osvix));

Std:

”RunningonOS:

osvix.dwMajorVersion<

”.”

osvix.dwMinorVersion<

//如果是NTS(Windows2000)系统,则提高其优先权

If(osvix.dwPlatformld==VERPLATFORMWIN32NT&

Osvix.dwMajorVersion>

=5

//改变优先级

SerPriorityClass(

GetCurrentProcess()//利用这一进程

HIGHPRIORITYCLASS);

//改变为high

//报告给用户

”TaskManagershouldnownowindicatethis”

“processishighpriority.”<

实验参考:

①在VisualC++窗口的工具栏中单击“打开”按钮,在“打开“对话框中找到并打开4-2.cpp源程序。

②单击Build菜单中的Compile4-2.cpp命令,再单击“是”按钮确认。

系统对4-2.cpp源程序进行编译。

③编译完成后,单击Build菜单中的Build4-2.exe命令,建立4-2.exe可执行文件。

④在工具栏单击ExecuteProgram(执行程序)按钮,执行4-2.exe程序。

实验任务:

写出程序运行后的以下几项结果。

当前PID信息。

当前操作系统版本。

系统提示信息。

5、终止进程

(3)编程三下面给出了一个终止进程的应用程序(文件名为4-3.cpp),它先创建一个子进程,然后命令它发出“自杀弹”互斥体去终止自身的运行。

stdio.h>

saticLPCTSTRgszMutexName=”w2kdg.ProcTerm.mutex.Suicide”;

//创建当前进程的克隆进程的简单方法

VoidStartClone()

//提取当前可执行文件的文件名

TCHARszFilename﹝MAXPATH﹞

:

GetModuleFileName(NULL,szFilename,MAXPATH);

//格式化用于子进程的命令行,指明它是一个EXE文件和子进程

TCHARszCmdLine﹝MAXPATH﹞;

sprintf(szCmdLine,”\”%s\”child”,szFilename);

//子进程的启动信息结构

STARTUPINFOsi;

ZeroMemory(reinterpretcast<

void*>

si),sizeof(si));

si.cb=sizeof(si);

//应当是此结构的大小

//返回的用于子进程的进程信息

//用同样的可执行文件名和命令行创建进程,并指明它是一个子进程

BOOLbCreateOK=:

CreateProcess(

SzFilename,//产生的应用程序名称(本EXE文件)

SzCmdLine,//告诉人们这是一个子进程的标志

NULL,//用于进程的默认的安全性

NULL,//用于线程的默认安全性

FALSE,//不继承句柄

CREATENEWCONSOLE,//创建新窗口,使输出更直观

NULL,//新环境

NULL,//当前目录

si,//启动信息结构

pi);

//返回的进程的信息

//释放指向子进程的引用

if(bCreateOK)

CloseHandle(pi.hThread);

VoidParent()

//创建“自杀”互斥程序体

HANDLEhMutexSuicide=:

CreatgeMutex(

NULL,//默认的安全性

TRUE,//最初拥有的

gszMutexName);

//为其命名

if(hMutexSuicide!

=NULL)

//创建子进程

std:

”Creatingthechildprocess.”<

std:

endl;

StartClone();

//暂停

sleep(5000);

//指令子进程“杀”掉自身

”Tellingthechildprocesstoquit.”<

ReleaseMutex(hMutexSuicide);

//消除句柄

CloseHandle(hMutexSuicide);

VoidChild()

//打开“自杀”互斥体

OpenMutex(

SYNCHRONIZE,//打开用于同步

FALSE,//不需要向下传递

//名称

if(hMutexSuicide!

//报告正在等待指令

Std:

”Childwaitingforsuicideinstructions.”<

WaitForSingleObject(hMutexSuicide,INFINITE);

//报告准备好终止,消除句柄

”Childquiting.”<

sleep(1000);

intmain(intarqc,char*argv﹝﹞)

//决定其行为是父进程还是子进程

if(argc>

1&

strcmp(argv﹝1﹞,”child”)==0)

Child();

else

Parent();

Return0;

分析:

程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。

在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。

当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。

然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

当调用ExitProcess()时要小心,进程中的所有线程都被立刻通知停止。

在设计应用程序时,必须让主线程在正常的C++运由期关闭(这是由编译器提供默认行为)之后来调用这一函数。

当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。

在正常的终止操作中,进程的每个工作线程都要终止,由主线程序员调用ExitProcess()。

接着,管理层对进程增加的所有对象释放引用,并将用GetExitChodeProcess()建立的退出代码从STILLACTIVE改变为ExitProcess()调用中返回的值。

最后,主线程对象也如同进程对象一样转变为受信状态。

等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。

还没有一种函数可取得终止后的进程对象为其参数,从而使具其“复活”。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1