《2022年实验一进程控制实践共享 .pdf》由会员分享,可在线阅读,更多相关《2022年实验一进程控制实践共享 .pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验一进程控制实践【实验目的】配合操作系统课程的学习,加深对进程的控制欲描述的理解并熟悉VC 的使用。【实验学时】建议 2 学时【实验内容】使用 MFC 提供的 CreateProcess函数创建进程,并给出系统的进程的基本信息,如ID 号,使用 TerminateProcess函数终止所创建的进程。【实验原理】操作系统的一个主要责任就是控制进程的执行,从进程的产生和终止来理解这次使用的原理。1、 进程的产生:当有一个新进程要加入当前进程的队列的时候,操作系统就产生一个控制进程的数据结构并且为该进程分配地址空间。这样,新进程就产生了,在windows 中这个工作主要是由CreateProces
2、s函数完成的。通常有四种事件会导致新进程的产生:a)在终端输入命令b)在批处理环境中为了响应一个任务的要求。c)获取到用户程序提出的要求后,OS 可以代用户程序产生进程以实现某种功能。d)基于应用进程的需要2、 进程的终止。使进程终止的条件很多,比如正常终止、超时限制、内存不足、超界等。3、 相关函数的说明。a)CreateProcess函数当一个线程调用CreateProcess 时,系统就会创建一个进程内核对象,该进程内核对象不是进程本身,而是操作系统管理进程的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成一个较小的数据结构。然后, 系统为新进程创建一个虚拟地址空间,并将可
3、执行文件或任何必要的DLL 文件的代码和数据加载到该进程的地址空间中。b)TerminateProcess 函数只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。该函数是一个异步运行的函数,也就是说, 它会告诉系统, 你想要进程终止运行,但是当函数返回的时候,你无法保证该进程已经终止运行。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 【实验要求】【实验步骤】1、 打开 VC,创建一个工程,Pr
4、ocess。2、 建立对话框类型,并添加四个按钮控件和一个List 控件。3、 为 List 控件添加一个成语变量m_list,类型为 CListCtrl 。4、 双击“创建进程”按钮,添加如下代码:void CProcessControlDlg:OncreateProcess() PROCESS_INFORMA TION pi; STARTUPINFO si; memset(&si,0,sizeof(si); si.cb = sizeof(si); bool fRet = CreateProcess( NULL, /程序名称cmd.exe,/ /程序执行命令行参数NULL, /设定进程对象的
5、安全属性NULL, /设定线程对象的安全属性false,/继承父进程属性开关名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,/标识标志, 用来表示如何来创建进程NULL, /指向包含新进程将要使用的环境字符串的内存块NULL,/ /设置子进程的当前驱动器和目录&si,/ /进程的初始化信息&pi); /指向必须置顶的PROCESS_INFORMA
6、TION结构, CreateProcess在返回之前要对该结构进行初始化 5、 双击“获取进程”按钮,添加如下代码: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); /
7、获得当前进程的一个快照的句柄HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 *info = new PROCESSENTRY32;info-dwSize = sizeof(PROCESSENTRY32); int i = 0; if (Process32First(handle,info) /*process32First 是一个进程获取函数, 当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后 ,我们可以利用process32First 函数来
8、获得第一个进程的句柄 .其原型为 (用的是 vfp) DECLARE INTEGER Process32First IN WIN32API ; INTEGER hSnapshot,STRING lppe 在 C 语言中如下BOOL WINAPI Process32First(HANDLE hSnapshot,LPROCESSENTRY32 lppe); */ if (GetLastError() = ERROR_NO_MORE_FILES) AfxMessageBox(No more process); else CString id; id.Format(%d,info-th32Proces
9、sID); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - m_list.InsertItem(i,id); m_list.SetItemData(i,info-th32ProcessID); id.Format(%s,info-szExeFile); m_list.SetItemText(i,1,id); i+; while (Process32Next(handle,info)!=FALSE)/与 Process32Firs
10、t类似,获得下一个进程信息 /将进程信息显示到ListBox id.Format(%5d,info-th32ProcessID); m_list.InsertItem(i,id); m_list.SetItemData(i,info-th32ProcessID); id.Format(%s,info-szExeFile); m_list.SetItemText(i,1,id); i +; CloseHandle(handle); 6、 双击“杀死进程”按钮,添加如下代码:void CProcessControlDlg:OnkillProcess() POSITION pos; pos = m_
11、list.GetFirstSelectedItemPosition(); int select = m_list.GetNextSelectedItem(pos); /获得选中进程的句柄HANDLE h = OpenProcess(PROCESS_ALL_ACCESS,TRUE,m_list.GetItemData(select); if (h != NULL) /结束进程TerminateProcess(h,0); OngetProcess(); 7、 双击“退出”按钮,添加如下代码:void CProcessControlDlg:Oncancel() CDialog:OnCancel(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 8、 编辑头文件,在ProcessDlg.cpp 文件中,添加如下代码:#include tlhelp32.h 9、 编译并运行名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -
限制150内