计科092 200900814221
实验二、进程的创建与撤消
一、
实验目的:
1. 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 下进程生存过程.
2. 通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法
给出本实验要求达到的目的
二、背景知识
1. 创建进程:CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行.下表详细地列出了每个参数的类型和名称.
参数名称 LPCTSTR lpApplivationName LPCTSTR lpCommandLine LPSECURIITY_ATTRIBUTES lpProcessAttributes LPSECURIITY_ATTRIBUTES 返回进程的主线程的句柄的安全属性 lpThreadAttributes BOOL bInheritHandle DWORD dwCreationFlage LPVOID lpEnvironment LPCTSTR lpCurrentDirectory STARTUPINFO lpStartupInfo LPPROCESS_INFORMATION 调用的结果块;发送新应用程序的进程和主线程的句柄和ID lpProcessInformation 一种标志,告诉系统允许新进程继承创建者进程的句柄 特殊的创建标志 (如CREATE_SUSPENDED) 的位标记 向新进程发送的一套环境变量;如为null值则发送调用者环境 新进程的启动目录 STARTUPINFO结构,包括新进程的输入和输出配置的详情 使用目的 全部或部分地指明包括可执行代码的EXE文件的文件名 向可执行文件发送的参数 返回进程句柄的安全属性.主要指明这一句柄是否应该由其他子进程所继承 三、实验内容 1.编译运行项目Lab2.1\\CntrlOtherPrcss.dsw,观察运行结果,并阅读和分析实验程序.
1
计科092 200900814221
*主要分析
A 、void CCntrlOtherPrcssDlg::OnStart(); B、 void CCntrlOtherPrcssDlg::OnStop();
2.编译运行项目Lab2.2\\proclist.dsw,观察运行结果,并阅读和分析实验程序. *主要分析
A 、void CCntrlOtherPrcssDlg::OnStart(); B、 void CCntrlOtherPrcssDlg::OnStop();
3. 编写程序将系统中所有的Notepad进程全部终止.
TerminateProcess就可以: BOOL TerminateProcess(
HANDLE hProcess, // handle to the process UINT uExitCode // exit code for the process );
二、
实验步骤:
需求分析:以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?并明确规定:
答:该实验要求我们编写程序体会如何创建进程,通过创建进程、观察正在运行
的进程和终止进程的程序设计和调试操作,学习创建进程、观察进程和终止进程的程序设计方法。
概要设计:说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 (1) 详细设计
2
计科092 200900814221
改程序是基于对话框的一个小程序,对话框上有两个按钮,当点击创建的时候,会打开c:\\\\windows\\\\notepad.exe c:\\\\autoexec.bat\文件,并提示创建进程成功,当点击结束的时候会关闭该文件 (2) 调试分析:
使用说明:说明如何使用你编写的程序,详细列出每一步的操作步骤。
新建一个
写相应的程序(具体程序将在程序清单中说明) 设计的对话框:
工程,选择基于对话框的程序,然后设计对话框,编
点击启动:
点击终止会关闭对话框。
三、
实验总结
3
计科092 200900814221
首先查看“任务管理器”进程的动态,并新建和关闭进程观察。接着是要创建进程和撤销进程,首要工作是我们得弄清楚两个系统函数CreateProcess()和TerminateProcess()入口参数的类型和函数,弄明白这些关键因素,然后就是如何将它们组织起来,我用的MFC的消息触发更加直观,有些参数弄的还是不太明白,还需要多多努力。 通过这次试验,我们加深了平时学习的理论知识和实践的联系,通过编程理解了进程的创建和终止。
附录:程序清单
#include \
#include \#include \#include \#ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
// CAboutDlg dialog used for App About class CAboutDlg : public CDialog {
public:
CAboutDlg(); // Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL // Implementation protected:
//{{AFX_MSG(CAboutDlg) //}}AFX_MSG
4
计科092 200900814221
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {
//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCntrlOtherPrcssDlg dialog
CCntrlOtherPrcssDlg::CCntrlOtherPrcssDlg(CWnd* pParent /*=NULL*/) : CDialog(CCntrlOtherPrcssDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CCntrlOtherPrcssDlg) //}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_hPro=NULL; }
void CCntrlOtherPrcssDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCntrlOtherPrcssDlg) //}}AFX_DATA_MAP }
5