实验一 进程控实践.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验一 进程控制实践 【实验目的】 配合操作系统课程的学习,加深对进程的控制欲描述的理解并熟悉VC的使用。 【实验学时】 建议2学时 【实验内容】 使用MFC提供的CreateProcess函数创建进程,并给出系统的进程的基本信息,如ID号,使用TerminateProcess函数终止所创建的进程。 【实验原理】 操作系统的一个主要责任就是控制进程的执行,从进程的产生和终止来理解这次使用的原理。 进程的产生:当有一个新进程要加入当前进程的队列的时候,操作系统就产生一个控制进程的数据结构并且为该进程分配地址空间。这样,新进程就产生了,在windows中这个工作主要是由CreateProcess函数完成的。通常有四种事件会导致新进程的产生: 在终端输入命令 在批处理环境中为了响应一个任务的要求。 获取到用户程序提出的要求后,OS可以代用户程序产生进程以实现某种功能。 基于应用进程的需要 进程的终止。 使进程终止的条件很多,比如正常终止、超时限制、内存不足、超界等。 相关函数的说明。 CreateProcess函数 当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,该进程内核对象不是进程本身,而是操作系统管理进程的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成一个较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的DLL文件的代码和数据加载到该进程的地址空间中。 TerminateProcess函数 只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。该函数是一个异步运行的函数,也就是说,它会告诉系统,你想要进程终止运行,但是当函数返回的时候,你无法保证该进程已经终止运行。 【实验要求】 【实验步骤】 打开VC,创建一个工程,Process。 建立对话框类型,并添加四个按钮控件和一个List控件。 为List控件添加一个成语变量m_list,类型为CListCtrl。 双击“创建进程”按钮,添加如下代码: void CProcessControlDlg::OncreateProcess() { PROCESS_INFORMATION pi; STARTUPINFO si; memset(si,0,sizeof(si)); si.cb = sizeof(si); bool fRet = CreateProcess( NULL,//程序名称 cmd.exe,//程序执行命令行参数 NULL,//设定进程对象的安全属性 NULL,//设定线程对象的安全属性 false,//继承父进程属性开关 NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,//标识标志,用来表示如何来创建进程 NULL,//指向包含新进程将要使用的环境字符串的内存块 NULL,//设置子进程的当前驱动器和目录 si,//进程的初始化信息 pi);//指向必须置顶的PROCESS_INFORMATION结构,CreateProcess在返回之前要对该结构进行初始化 } 双击“获取进程”按钮,添加如下代码: void CProcessControlDlg::OngetProcess() { //设置ListBox,用来显示当前进程 m_list.DeleteAllItems(); while(m_list.DeleteColumn(0)); m_list.ModifyStyle(0,LVS_REPORT); m_list.InsertColumn(0,进程ID,LVCFMT_LEFT,80); m_list.InsertColumn(1,进程名称,LVCFMT_LEFT,150); //获得当前进程的一个快照的句柄 HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 *info = new PROCESSENTRY32; info-dwSize = sizeof(PROCESSENTRY32); int i = 0; if (Process32First(handle,info)) /*process32First 是一个进程获取函数, 当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程 的快照后,我们可以利用process32First函数来获得第一个进程的 句柄.其原型为(用的是vfp) DECLAR

文档评论(0)

mei1809816wei + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档