实验一 进程控制实践
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一进程控制实践
【实验目的】
配合操作系统课程的学习,加深对进程的控制欲描述的理解并熟悉VC的使用。
【实验学时】
建议2学时
【实验内容】
使用MFC提供的CreateProcess函数创建进程,并给出系统的进程的基本信息,如ID号,使用TerminateProcess函数终止所创建的进程。
【实验原理】
操作系统的一个主要责任就是控制进程的执行,从进程的产生和终止来理解这次使用的原理。
1、进程的产生:当有一个新进程要加入当前进程的队列的时候,操作系统就产生一个控制
进程的数据结构并且为该进程分配地址空间。
这样,新进程就产生了,在windows中这个工作主要是由CreateProcess函数完成的。
通常有四种事件会导致新进程的产生:
a)在终端输入命令
b)在批处理环境中为了响应一个任务的要求。
c)获取到用户程序提出的要求后,OS可以代用户程序产生进程以实现某种功能。
d)基于应用进程的需要
2、进程的终止。
使进程终止的条件很多,比如正常终止、超时限制、内存不足、超界等。
3、相关函数的说明。
a)CreateProcess函数
当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,该进程内核
对象不是进程本身,而是操作系统管理进程的一个较小的数据结构。
可以将进程内
核对象视为由进程的统计信息组成一个较小的数据结构。
然后,系统为新进程创建
一个虚拟地址空间,并将可执行文件或任何必要的DLL文件的代码和数据加载到
该进程的地址空间中。
b)TerminateProcess函数
只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。
该函
数是一个异步运行的函数,也就是说,它会告诉系统,你想要进程终止运行,但是
当函数返回的时候,你无法保证该进程已经终止运行。
【实验要求】
【实验步骤】
1、打开VC,创建一个工程,Process。
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,//设定进程对象的安全属性
NULL,//设定线程对象的安全属性
false,//继承父进程属性开关
NORMAL_PRIORITY_CLASS|CREA TE_NEW_CONSOLE,//标识标志,用来表示如何来创建进程
NULL,//指向包含新进程将要使用的环境字符串的内存块
NULL,//设置子进程的当前驱动器和目录
&si,//进程的初始化信息
&pi);//指向必须置顶的PROCESS_INFORMA 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);
//获得当前进程的一个快照的句柄
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)
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->th32ProcessID);
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)
//与Process32First类似,获得下一个进程信息
{
//将进程信息显示到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_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();
}
8、编辑头文件,在ProcessDlg.cpp文件中,添加如下代码:#include "tlhelp32.h"
9、编译并运行。