操作系统实验报告4Word下载.docx
- 文档编号:20589895
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:17
- 大小:148.99KB
操作系统实验报告4Word下载.docx
《操作系统实验报告4Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告4Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
windows.h>
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);
﹜
修改后:
#include<
stdio.h>
windows.h>
intmain(VOID)
{
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
si.cb=sizeof(si);
"
c:
\\WINDOWS\\system32\\mspaint.exe"
NULL,
FALSE,
0,
NULL,
&
{
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
实验任务:
写出程序的运行结果。
4.正在运行的进程
(2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。
它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。
确定运行进程的操作系统版本号。
阅读该程序并完成实验任务。
#include<
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.”<
修改后:
#include<
voidmain()
{
DWORDdwVerReq=:
WORDwMajorReq=((WORD)dwVerReq>
WORDwMinorReq=((WORD)dwVerReq&
0xffff);
std:
<
"
ProcessID:
requiresOS:
//设置版本信息的数据结构,以便保存操作系统的版本信息
OSVERSIONINFOEXosvix;
:
osvix.dwOSVersionInfoSize=sizeof(osvix);
//提取版本信息和报告
GetVersionEx(reinterpret_cast<
RunningonOS:
."
<
//如果是NTS(Windows2000)系统,则提高其优先权
if(osvix.dwPlatformId==VER_PLATFORM_WIN32_NT&
&
osvix.dwMajorVersion>
=5)
//改变优先级
:
SetPriorityClass(
:
GetCurrentProcess(),//利用这一进程
HIGH_PRIORITY_CLASS);
//报告给用户
std:
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信息1628。
当前操作系统版本RunningonOS:
5.1。
系统提示信息TaskManagershouldnownowindicatethisprocessishighpriority。
5、终止进程
(3)编程三下面给出了一个终止进程的应用程序(文件名为4-3.cpp),它先创建一个子进程,然后命令它发出“自杀弹”互斥体去终止自身的运行。
saticLPCTSTRgszMutexName=”w2kdg.ProcTerm.mutex.Suicide”;
//创建当前进程的克隆进程的简单方法
VoidStartClone()
//提取当前可执行文件的文件名
TCHARszFilename﹝MAXPATH﹞
GetModuleFileName(NULL,szFilename,MAXPATH);
//格式化用于子进程的命令行,指明它是一个EXE文件和子进程
TCHARszCmdLine﹝MAXPATH﹞;
sprintf(szCmdLine,”\”%s\”child”,szFilename);
//子进程的启动信息结构
ZeroMemory(reinterpretcast<
void*>
si),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)
﹛
//创建子进程
”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;
staticLPCTSTRg_szMutexName="
w2kdg.ProcTerm.mutex.Suicide"
;
voidStartClone()
TCHARszFilename[MAX_PATH];
GetModuleFileName(NULL,szFilename,MAX_PATH);
TCHARszCmdLine[MAX_PATH];
sprintf(szCmdLine,"
\"
%s\"
child"
szFilename);
ZeroMemory(reinterpret_cast<
void*>
szFilename,//产生的应用程序名称(本EXE文件)
szCmdLine,//告诉人们这是一个子进程的标志
CREATE_NEW_CONSOLE,//创建新窗口,使输出更直观
voidParent()
CreateMutex(
NULL,//默认的安全性
TRUE,//最初拥有的
g_szMutexName);
//创建子进程
Creatingthechildprocess."
Sleep(5000);
Tellingthechildprocesstoquit."
voidChild()
SYNCHRONIZE,//打开用于同步
Childwaitingforsuicideinstructions."
Childquiting."
Sleep(1000);
intmain(intargc,char*argv[])
1&
strcmp(argv[1],"
)==0)
{
}
return0;
分析:
程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。
在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。
当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。
然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。
当调用ExitProcess()时要小心,进程中的所有线程都被立刻通知停止。
在设计应用程序时,必须让主线程在正常的C++运由期关闭(这是由编译器提供默认行为)之后来调用这一函数。
当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。
在正常的终止操作中,进程的每个工作线程都要终止,由主线程序员调用ExitProcess()。
接着,管理层对进程增加的所有对象释放引用,并将用GetExitChodeProcess()建立的退出代码从STILLACTIVE改变为ExitProcess()调用中返回的值。
最后,主线程对象也如同进程对象一样转变为受信状态。
等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。
还没有一种函数可取得终止后的进程对象为其参数,从而使具其“复活”。
当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。
进程可使用退出代码将终止方式通知给调用GetExitCodeProcess()的其他进程。
同时,GetProcessTimes()API函数可向主调者显示
进程的终止时间。
①在VisualC++窗口的工具栏中单击“打开”按钮,在“打开”对话框中找到并打开4-3.cpp命令源程序。
②单击Build菜单中的Compile4-3.cpp命令,再单击“是”按钮确认。
系统对4-3.cpp源程序进行编译。
③编译完成后,单击Build菜单中的Build4-3.exe命令,建立4-3.exe可执行文件。
四、程序调试(结果及分析)
五、总结与体会
六、教师评语
签名:
日期:
成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告