




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统试验
创建进程实验创建进程第1页学会经过基本Windows进程控制函数,由父进程创建子进程。实验目实验创建进程第2页我们设计一个应用程序时,有时候需要另外一段代码做一些其它工作。方法以下:一、函数调用或者子程序弊端:我们能够用函数调用或者子程序,不过我们调用函数之后,只能等函数返回;二、在进程内创建一个新线程弊端:不过假如在一个复杂应用系统中,我们有可能不慎改写了进程地址空间中一些数据(比如一些引用数据),造成其它工作不能正确地进行。实验创建进程第3页三、创建新进程(子进程)所以当我们需要一些工作同时进行,而且希望保护它们运行地址空间时,一个很好地方法是创建一个新进程来执行需要同时进行工作。实验创建进程第4页假设现在有这么一个工作,需要计算1——100和,还需要做一个工作是读写文件。我们能够让父进程计算,创建一个子进程实现读写文件。主要工作:1、首先由父进程创建子进程2、让子进程创建一个文件并写入数据,子进程写文件过程中,父进程继续执行计算工作3、等子进程执行完以后,父进程读取文件内容输出,实现进程协同工作。试验内容实验创建进程第5页父进程框架voidmain(){//为创建进程做准备工作//创建子进程If(创建失败)返回Else(创建成功)//执行计算1——100和//等子进程执行完,读取子进程文件内容,并输出。}程序框架实验创建进程第6页子进程框架voidmain(){//创建文件If(失败)返回Else(成功)//向文件写入数据//读取文件内容输出}实验创建进程第7页BOOLCreateProcess(LPCTSTRlpApplicationName,//指定可执行程序名LPTSTRlpCommandLine,//命令行字符串,可认为NULLLPSECURITY_ATTRIBUTESlpProcessAttributes,//新进程对象安全属性LPSECURITY_ATTRIBUTESlpThreadAttributes,//新进程对应线程安全属性BOOLbInheritHandles,//指定父进程对象句柄是否能被子进程继承DWORDdwCreationFlags,//指定创建进程附加标记,即指定新创建进程特征LPVOIDlpEnvironment,//指定新进程使用环境,NULL表示同父进程环境LPCTSTRlpCurrentDirectory,//指定子进程当前路径,NULL表示与父进程路径相同LPSTARTUPINFOlpStartupInfo,//指定新进程主窗口怎样显示LPPROCESS_INFORMATIONlpProcessInformation//作为返回值使用,是一个指针);父进程创建子进程
用CreateProcess函数来创建一个新进程实验创建进程第8页当调用CreateProcess时,系统所做工作:1、首先,系统创建一个进程内查对象,其初始使用计数为1。(进程内查对象并不代表进程本身,而是操作系统用来管理这个进程一个数据结构。)实验创建进程第9页2、然后,系统为新进程创建一个虚拟地址空间,并将可执行文件(和全部必要DLL)代码及数据加载到进程地址空间。3、最终,系统为新进程创建一个根本程内查对象(使用计数为1)(线程内查对象是操作系统用来管理线程数据结构。)实验创建进程第10页系统做完这些工作以后,新进程根本程就开始执行运行时开启代码,在开启代码中会调用应用程序main函数,这么,新进程就从main函数开始执行。假如调用CreateProcess函数后,系统成功创建了新进程而且创建了其根本程,则系统返回TRUE,不然返回FALSE。实验创建进程第11页讨论CreateProcess参数。LPCTSTRlpApplicationNamelpApplicationName参数指定新进程要使用可执行文件名称。可以是完整路径和文件名,也可以是部分名称。注意一定要加上扩展名“.exe”。在此次实验中,使用全路径和文件名。CreateProcess("G:\\Projects\\操作系统编程实验\\创建进程\\Child\\Debug\\Child.exe",NULL,…)(该参数可认为NULL,这时文件名必须是参数lpCommandLine指向字符串中第一个空格界定标记。)实验创建进程第12页LPTSTRlpCommandLinelpCommandLine参数用来指定传递给新进程命令行字符串。在此次试验中,不需要这个参数,能够设为NULL。(在很多时候,我们将可执行文件名和命令行参数都传给lpCommandLine参数,CreateProcess函数分析lpCommandLine参数时,会把该字符串中第一个空格分隔标识作为可执行文件名,假如是可执行文件名是部分路径,则函数会在系统目录中按从下到上次序搜索可执行文件。)实验创建进程第13页LPSECURITY_ATTRIBUTESlpProcessAttributes和LPSECURITY_ATTRIBUTESlpThreadAttributes
lpProcessAttributes和lpThreadAttributes
都是指向指向LPSECURITY_ATTRIBUTES结构体指针。前面介绍过,当调用CreateProcess函数创建新进程时,系统将为新进程创建一个进程内查对象和一个根本程内查对象。lpProcessAttributes和lpThreadAttributes
参数就是分别用来设置新进程内查对象和根本程内查对象安全属性。在此次试验中为这两参数传递NULL,让系统为这两个对象赋予默认安全描述符。CreateProcess(“….exe”,NULL,NULL,NULL…)实验创建进程第14页BOOLbInheritHandlesbInheritHandles用来指定父进程随即创建子进程是否能够继承父进程对象句柄。假如该参数为TRUE,那么父进程每个可继承打开句柄都能被子进程继承。在此次试验中,把这个参数设置为FALSE,因为子进程不需要继承父进程可继承句柄。CreateProcess(“….exe”,NULL,NULL,NULL,FALSE,…)实验创建进程第15页DWORDdwCreationFlagsdwCreationFlags指定进程创建附加标识,也能够用于控制新进程优先级。假如只为了开启子进程,不需要设置创建标识,则直接设置为0.假如不需要为应用程序创建控制台窗口,则能够设置该参数为CREATE_NO_WINDOW.假如需要创建新控制台窗口,而不是继承父进程控制台窗口,则设置为CREATE_NEW_CONSOLE.此次试验中设置为该标识。CreateProcess(“….exe”,…,
CREATE_NEW_CONSOLE,
…)该参数能够取得创建标识很多,也能够用于设置新进程优先级。更多设置能够参看MSDN。实验创建进程第16页LPVOIDlpEnvironmentlpEnvironment是一个指向环境块指针,假如此参数是NULL,那么新进程使用调用进程环境。通常都为此参数传递NULL。LPTSTRlpCurrentDirectorylpCurrentDirectory参数是一个指向空终止字符串,用来指定子进程当前路径,这个字符串必须是一个完整路径名,包含驱动器标识符,假如此参数为NULL,那么新子进程将于调用进程(父进程)用有相同驱动器和目录。CreateProcess(“….exe”,…,
CREATE_NO_WINDOW,NULL,NULL,…)实验创建进程第17页LPSTARTUPINFOlpStartupInfolpStartupInfo是一个指向STARTUPINFO结构体指针,用来指定新进程主窗口将怎样显示。typedefstruct_STARTUPINFO{DWORDcb;LPTSTRlpReserved;LPTSTRlpDesktop;LPTSTRlpTitle;……
……HANDLEhStdInput;HANDLEhStdOutput;HANDLEhStdError;}STARTUPINFO,*LPSTARTUPINFO;实验创建进程第18页STARTUPINFO结构体组员比较多,并不需要为其全部组员都赋值。其中cb表示该结构体本身大小,以字节为单位,通常都要为其cb组员赋值,不然函数调用会失败。在创建进程之前准备工作就包含给该结构体变量赋值。在此次试验中,不需要设置其它开启信息,所以直接给cb参数赋值就能够。STARTUPINFOsui;ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);CreateProcess(…,&si,…);实验创建进程第19页LPPROCESS_INFORMATIONlpProcessInformationlpProcessInformation参数作为返回值使用,是一个指向PROCESS_INFORMATION结构体指针,用来接收关于新进程标志信息。PROCESS_INFORMATION结构体定义以下所表示:typedefstruct_PROCESS_INFORMATION{HANDLEhProcess;HANDLEhThread;DWORDdwProcessId;DWORDdwThreadId;}PROCESS_INFORMATION;实验创建进程第20页hProcess和hThread分别是标识新创建进程句柄和新创建进程根本程句柄;dwProcessId和dwThreadId分别是全局进程标识符和全局线程标识符,前者用来标识一个进程,后者用来标识一个线程。(当开启一个进程时,系统会为此进程分配一个标识符,同时这个进程中线程也会被分配一个标识符,在一个进程运行时,该进程标识符和线程标识符是唯一,停顿后,这些标识符可能会被系统分配给其它进程和线程。)实验创建进程第21页在创建进程之前另一项准备工作就是要定义PROCESS_INFORMATION结构体变量,准备用于接收创建进程后返回信息。PROCESS_INFORMATIONpi;CreateProcess(…,&si,&pi);实验创建进程第22页CreateProcess函数返回值创建进程成功后,该函数返回TRUE,不然返回FALSE.在程序中需要判断进程创建是否成功If(!CreateProcess(…,&si,&pi))//创建不成功Return;Else //创建成功 //父进程继续执行实验创建进程第23页在父进程创建子进程后,子进程就开始运行;同时父进程计算1——100和。因为计算太快,为了方便观察父进程和子进程系统工作过程,能够在计算过程使用Sleep函数,强制让父进程根本程休眠。Sleep函数定义以下:void
Sleep(
DWORD
dwMilliseconds);//休眠一段时间,以ms为单位Sleep(1000);//表示休眠1秒实验创建进程第24页计算完之后等候子进程完成它工作。等候子进程完成能够用WaitForSingleObject函数实现等候。该函数定义以下:DWORD
WaitForSingleObject(HANDLE
hHandle,DWORD
dwMilliseconds);实验创建进程第25页hHandle参数指定需要等候对象句柄。dwMilliseconds参数指定需要等候时间,以ms为单位。0表示马上返回不等候。INFINITE表示等候直到对象句柄可用。WaitForSingleObject(pi.hProcess,INFINITE);实验创建进程第26页父进程等候子进程完成工作后,父进程需要读取文件内容并输出,是文件一个操作。这在下面在子进程中介绍文件操作时一起系统介绍。实验创建进程第27页子进程工作主要包括是文件操作。创建文件能够用fopen函数FILE*fopen( //返回一个指向文件结构体指针constchar*filename,//打开或创建文件名const
char*mode
//打开或创建方式,即设定读写权限);Fopen函数既能够创建文件也能够打开已存在文件FILE*pFile=fopen("1.txt","w"); 子进程实验创建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专题22 能源与可持续发展-2025年中考《物理》一轮复习知识清单与解题方法
- 二零二五年度药品研发成果许可与销售分成合同范本
- 2025年度劳动合同法企业劳动争议调解中心设立合同
- 河道整治砂石运输合同模板
- 2025年度生物科技行业劳动合同解除协议范本
- 2025年度供应链金融应收账款回款合作协议
- 家具销售居间合同文件资料
- 2025年度品牌连锁店铺授权经营合同
- 2025年度山林资源承包与生态补偿金支付合同书
- 二零二五年度企业员工绩效对赌合作框架协议
- 护苗行动安全教育课件
- 生物-山东省潍坊市、临沂市2024-2025学年度2025届高三上学期期末质量检测试题和答案
- 2025年小学督导工作计划
- 2024-2025学年部编版历史九年级上册期末复习练习题(含答案)
- 矿山工程安全培训课件
- 基于ChatGPT的ESG评级体系实现机制研究
- 2024年精对苯二甲酸市场分析报告
- 成人手术后疼痛评估与护理团体标准
- 2025年中考数学二轮专题复习 题型四-二次函数图象与性质综合题
- 春节申遗成功的意义
- 上海市黄浦区2022-2023学年九年级上学期期末化学试卷(一模)
评论
0/150
提交评论