操作系统.docx
- 文档编号:29830860
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:12
- 大小:39.82KB
操作系统.docx
《操作系统.docx》由会员分享,可在线阅读,更多相关《操作系统.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统
进
程
的
产
生
执
行
与
消
亡
计算机网络技术1102班
张花
1108040212
一.实验目的
1.通过创建进程、观察正在运行得到进程和终止进程的程
序设计和调试操作,进一步熟悉操作系统的进程概念,以windows2000操作系统下进程的建立执行与消亡为事例,理解进程是“程序的一次执行的内涵”,进而进一步理解进程是有生命的。
2.通过阅读和分析实验进程,学习创建进程、观察进程和终止的设计方法。
二.实验原理
Windows所创建的每一个进程都从调用CreatProcess()API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。
每一进程都可以调用ExitProcess()或TerminateProcess()API函数终止。
通常应用程序的框架负责调用ExitProcess()函数。
对于C++运行库来说,这一调用发生在应用程序的main()函数返回之后。
1.创建进程
CreatProcess()调用的核心参数是可执行文件运行是的文件及其命令行。
表中详细的列出每个参数的类型和名称。
参数名称
使用目的
LPCTSTRIpApplivationName
全部或部分地指明包括可执行代码的EXE文件名
LPCTSTRIpCommandLine
向可执行文件发送参数
LPSECURIITY_ATTRIBUTES
IpProcessAttrubutes
返回进程句柄的安全属性。
主要指明之一句柄是否该由其他子进程所继承
LPSECURIIY_ATTRIBUTES
IpThreadAttrubutes
返回进程的主线程的句柄的安全属性
BOOLbInheritHandle
一种标志,告诉系统允许新进程继承创建者进程的句柄
DWORDdwCreationFlage
特殊的创建标志(如CREAT_SUSPENDED)的位标记
LPVOIDIpEnvironment
向新进程发送的一套环境变量:
如为NULL值则发送调用者环境
LPCTSTRIpCurrentDirectory
新进程的启动目录
STARTUPINFOIpStartupInfo
STARTUPINFO结构,包括新进程的输入和输出配置的详情
LPPROCESS_INFORMATION
IpProcessInformation
调用的结果块;发送新应用进程的进程和主线程的句柄和ID
可以指定第一个参数,即应用程序的名称,其中包括相当于前进程的当前录的全路径或者利用搜索方法找到路径;IpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。
然后是标志参数,用以在dwCreationFlage参数中指名系统应该给与新进程什么行为。
经常使用标志是CREAT_SUSPENDED,告诉进程立即暂停。
当准备好时,应该使用ResumeThread()API来启动进程。
另一个常用标志是CREAT_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口。
这一参数允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。
接着是CreatPoocess()函数调用所需要的三个通常使用缺省值得参数,第一个参数是IpEvironment()参数,指明为新进程提供环境,第二个参数是IpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录,第三个参数是STARTUPINFO数据结构所必须要的,用于在必要时指明新应用进程的主窗口的外观。
CreatPoocess()的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区,以PROCESS_INFORMATION结构中返回的句柄用于
CloseHandle()API函数是最重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何为解释的资源。
2.终止进程
所有的进程都是以ExitProcess()或TerminateProcess()函数结束的,但是最好使用前者而不是使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前者的。
而外部进程通常调用后者即突然终止进程的执行,由于关闭是途径不太正常,有可能引起错误的行为。
TerminateProcess()API函数只要打开带有PROCESS_INFORMATION访问权的进程对象,就可以结束进程,并向系统返回指定的代码,这是一种“野蛮”的终止进程的方式,但是有时的确需要。
如果开发人员的确是有机会来设计“谋杀”和“受害”进程时,应该创建一个进程间通讯的内核对象如一个互斥程序这样一来“受害”进程指在等待或周期性的测试它是否该终止。
三.实验环境
1.一台运行windows2000professional操作系统的计算机
2.计算机中需要安装Visualc++6.0专业版或企业版。
四.实验内容
1.创建进程
#include
#include
#include
//创建传递过来的进程的克隆过程并赋予其Id值
voidStartClone(intnCloneID){
//提取用于当前可执行文件的文件名
TCHARszFilename[MAX_PATH];
:
:
GetModuleFileName(NULL,szFilename,MAX_PATH);
//格式化用于自进程的命令行并通过其EXE文件名和克隆ID
TCHARszCmdLine[MAX_PATH];
:
:
sprintf(szCmdLine,"\"%s\"d%",szFilename,nCloneID);
//用于自进程的STARTUPINFO结构
STARTUPINFOsi;
:
:
ZeroMemory(reinterpret_cast
si.cb=sizeof(si);
//返回用于自进程的进程信息
PROCESS_INFORMATIONpi;
//利用同样的执行文件和命令行创建进程,并赋予其子进程的性质
BOOLbCreateOK=:
:
CreateProcess(
szFilename,//产生这个EXE的应用程序名称
szCmdLine,//告诉我们这是一个在进程的标志
NULL,//却省的进程安全性
NULL,//却省的线程安全性
FALSE,//不继承句柄
CREATE_NEW_CONSOLE,//使用新的控制台
NULL,//新的环境
NULL,//当前记录
&si,//启动信息
&pi);//返回的进程信息
//对在进程释放引用
if(bCreateOK){
:
:
CloseHandle(pi.hProcess);
:
:
CloseHandle(pi.hThread);
}
}
intmain(intargc,char*argv[]){
//确定进程在列表中的位置
intnClone(0);
if(argc>1){
//从第二个参数中提取克隆ID
:
:
sscanf(argv[1],"%d",&nClone);
}
//显示进程位置
:
:
cout<<"ProcessID:
"<<:
:
GetCurrentProcessId()
<<",CloneID:
"< <<: : endl; //检查是否有创建在进程的需要 constintc_nCloneMax=25; if(nClone //发送新进程的命令行和克隆号 StartClone(++nClone); } //在终止之前暂停一下 : : Sleep(500); return0; } 2正在运行的进程: 本实验的程序中列出了用于进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用,可确定运行进程的操作系统的版本号。 #include #include voidmain(){ //提取这个进程的ID号 DWORDdwIdThis=: : GetCurrentProcessId(); //获得这一进程和报告所需的版本 DWORDdwVerReq=: : GetProcessVersion(dwIdThis); WORDwMajorReq=(WORD)(dwVerReq>16); WORDwMinorReq=(WORD)(dwVerReq&0xffff);//0 : : cout<<"ProcessID: "< <<",requiresOS: "< < : endl; //设置版本信息的数据结构,以便保存操作系统的版本信息 OSVERSIONINFOEXosvix; : : ZeroMemory(&osvix,sizeof(osvix)); osvix.dwOSVersionInfoSize=sizeof(osvix); //提取版本信息和报告 : : GetVersionEx(reinterpret_cast : : cout<<"RunningonOS: "< < : endl; //如果是NTS系统,则提高其优先权 if(osvix.dwPlatformId==VER_PLATFORM_WIN32_NT &&osvix.dwMajorVersion>=5) { : : SetPriorityClass( : : GetCurrentProcess(), HIGH_PRIORITY_CLASS); //报告给用户 : : cout<<"TaskManagershouldnowindicatethis" "processsishighpriority."<<: : endl; } } 3终止进程 在下面列出的程序中,先建立一个子进程,然后指令它发出“自杀弹”互斥体去终止自身的运行。 #include #include #include 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 si.cb=sizeof(si); //返回用于子进程的进程信息 PROCESS_INFORMATIONpi; //用同样的可执行文件名和命令行创建进程,并指明它是一个子进程 BOOLbCreateOK=: : CreateProcess( szFilename, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); //释放指向子进程的引用 if(bCreateOK) { : : CloseHandle(pi.hProcess); : : CloseHandle(pi.hThread); } } voidParent() { //创建“自杀”互斥程序体 HANDLEhMutexSuicide=: : CreateMutex( NULL, TRUE, g_szMutexName); if(hMutexSuicide! =NULL) { //创建子进程 : : cout<<"Creatingthechildprocess."<<: : endl; : : StartClone(); //暂停 : : Sleep(5000); //指令子进程“杀”掉自身 : : cout<<"Tellingthechildprocesstoquit."<<: : endl; : : ReleaseMutex(hMutexSuicide); //消除句柄 : : CloseHandle(hMutexSuicide); } } voidChild() { //打开“自杀”互斥体 HANDLEhMutexSuicide=: : OpenMutex( SYNCHRONIZE, FALSE, g_szMutexName); if(hMutexSuicide! =NULL) { //报告我们正在等待命令 : : cout<<"Childwaitingforsuicideinsructions."<<: : endl; : : WaitForSingleObject(hMutexSuicide,INFINITE); //准备好终止,消除句柄 : : cout<<"Childquiting."<<: : endl; : : CloseHandle(hMutexSuicide); } } intmain(intargc,char*argv[]) { //决定其行为时父进程还是子进程 if(argc>1&&: : strcmp(argv[1],"child")==0) { Child(); } else { Parent(); } return0; } 五.实验结果 六.实验分析 通过这此实验,自己动手创建了进程,观察了进程的运行和消亡,进一步的理解了进程在操作系统中的概念,和一次进程的创建执行的内涵,在实验中,看看命令提示符在不停的创建,不停的弹出窗口,才真正意义上明白了进程的创建,又明白了进程的消亡。 通过这才实验学习到了进程的创建、执行和消亡。 在这次实验中深深的体会到实践和理论相结合的重要。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统