编程中的进程管理.ppt
《编程中的进程管理.ppt》由会员分享,可在线阅读,更多相关《编程中的进程管理.ppt(67页珍藏版)》请在三一办公上搜索。
1、,Windows系统编程实用教程,授课教师:职务:,第7章 进程编程,课程描述大多数应用程序都以进程的形式运行,有时还需要在应用程序里运行或结束其他进程。本章将介绍Windows进程编程的方法。,本章知识点,7.1 进程编程基础7.2 基本进程编程7.3 进程间通信,7.1 进程编程基础,7.1.1 什么是进程7.1.2 进程的状态,7.1.1 什么是进程,进程是正在运行的程序的实例。每个运行的Visual C+项目都对应一个进程,每个进程至少包含一个线程,它从main()函数开始执行,直到执行return语句返回,主线程结束,该进程也被从内存中卸载。进程由如下几个部分组成。与程序相关联的可执
2、行代码的映像;内存空间(通常是虚拟内存中的一些区域),其中保存可执行代码、进程的特定数据、用于记录活动例程和其他事件的调用栈、用于保存实时产生的中间计算结果的堆(heap)。分配给进程的资源的操作系统描述符(比如文件句柄)以及其他数据资源。安全属性,比如进程的所有者和权限。处理器的状态,比如寄存器的内容、物理内存地址等。,7.1.2 进程的状态,7.2 基本进程编程,7.2.1 创建进程7.2.2 枚举系统进程7.2.3 终止进程,7.2.1 创建进程,在应用程序中可以调用CreateProcess()函数创建一个新进程、运行其他程序,函数原型如下:BOOL WINAPI CreateProc
3、ess(_in LPCTSTR lpApplicationName,_in_out LPTSTR lpCommandLine,_in LPSECURITY_ATTRIBUTES lpProcessAttributes,_in LPSECURITY_ATTRIBUTES lpThreadAttributes,_in BOOL bInheritHandles,_in DWORD dwCreationFlags,_in LPVOID lpEnvironment,_in LPCTSTR lpCurrentDirectory,_in LPSTARTUPINFO lpStartupInfo,_out LP
4、PROCESS_INFORMATION lpProcessInformation);,参数说明,lpApplicationName,要执行的应用程序名,可以包括结对路径和文件名,通常可以为NULL。lpCommandLine,要执行的命令行。lpProcessAttributes,新进程的安全描述符。lpThreadAttributes,指定主线程的安全描述符。如果为NULL,则使用默认的安全描述符。bInheritHandles,指示新进程是否从调用进程处继承句柄。dwCreationFlags,指定附加的、用来控制优先类和进程创建的标志。lpEnvironment,指向新进程的环境块。如果
5、为NULL,则使用调用CreateProcess()函数的进程的环境。,【例7.1】,调用CreateProcess()函数运行Windows计算器程序,并显示新进程的ID号,及其主线程的Id号,代码如下:#include stdafx.h#include int _tmain(int argc,_TCHAR*argv)char szCommandLine=calc.exe;STARTUPINFO si=sizeof(si);PROCESS_INFORMATION pi;si.dwFlags=STARTF_USESHOWWINDOW;/指定wShowWindow成员有效si.wShowWind
6、ow=TRUE;/显示新建进程的主窗口,接上,BOOL bRet=CreateProcess(NULL,/不在此指定可执行文件的文件名szCommandLine,/命令行参数NULL,/默认进程安全性NULL,/默认进程安全性FALSE,/指定当前进程内句柄不可以被子进程继承CREATE_NEW_CONSOLE,/为新进程创建一个新的控制台窗口NULL,/使用本进程的环境变量NULL,/使用本进程的驱动器和目录,【例7.1】的运行结果,ShellExecute()函数,HINSTANCEShellExecute(HWNDhwnd,/指定显示用户界面和错误信息的窗口句柄LPCTSTRlpOper
7、ation,/对指定文件要执行的操作LPCTSTRlpFile,/要执行操作的文件或对象LPCTSTRlpParameters,/指定传送给应用程序的参数LPCTSTRlpDirectory,/指定执行操作的工作目录INTnShowCmd/指定应用程序如何显示。SW_HIDE表示隐藏窗口,SW_MAXIMIZE表示最大化窗口,SW_MINIMIZE表示最小化窗口,SW_SHOW表示在当前位置上以当前大小显示窗口,等等);,pOperation参数的取值,【例7.2】,【例7.2】调用ShellExecute()函数访问google网站,代码如下:#include stdafx.h#includ
8、e windows.h”int _tmain(int argc,_TCHAR*argv)ShellExecute(NULL,open,http:/,SW_SHOW);return 0;,7.2.2 枚举系统进程,1使用EnumProcesses()函数2使用进程快照,1使用EnumProcesses()函数,BOOL WINAPI EnumProcesses(_out DWORD*pProcessIds,/用于接收进程标示符列表的数组 _in DWORD cb,/数组pProcessIds的大小,单位是字节 _out DWORD*pBytesReturned/数组pProcessIds中返回数
9、据的大小,单位是字节);如果函数执行成功,则返回一个非0值;否则返回0。,【例7.3】,调用EnumProcess()函数枚举当前Windows运行进程的标示符(PID),代码如下:#include stdafx.h#include#include#pragma comment(lib,Psapi.lib)int _tmain(int argc,_TCHAR*argv)/用于接收返回的进程ID信息的数组 DWORD dwProcs1024*2;DWORD dwNeeded;/返回进程数组的大小/枚举所有进程ID。,接上,if(!EnumProcesses(dwProcs,sizeof(dwPr
10、ocs),【例7.3】的运行结果,2使用进程快照,HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,/指定快照中包含的对象 DWORD th32ProcessID/指定获取进程快照的PID。如果为0,则获取当前系统进程列表);如果函数执行成功,则返回进程快照的句柄;否则返回INVALID_HANDLE_VALUE。,Process32First()函数,调用Process32First()函数可以从进程快照中获取第1个进程的信息,函数原型如下:BOOL WINAPI Process32First(HANDLE hSnapshot,/之前调
11、用createtoolhelp32napshot()函数得到的进程快照句柄 LPPROCESSENTRY32 lppe/包含进程信息的结构体);,结构体LPPROCESSENTRY32,LANA_ENUM结构体中包含当前逻辑网络适配器的数量。当一个物理网络适配器绑定到一个网络协议时,就对应一个逻辑网络适配器。执行NCB命令NCBENUM可以向LANA_ENUM结构体中填充逻辑网络适配器的个数和逻辑网络适配器编号,此时NCB结构体中的ncb_buffer成员变量指向LANA_ENUM结构体。LANA_ENUM结构体的定义代码如下:typedef struct _LANA_ENUM UCHAR l
12、ength;UCHAR lanaMAX_LANA;LANA_ENUM,*PLANA_ENUM;参数说明如下:length,系统中包含的逻辑网络适配器数量。lanaMAX_LANA,系统中包含的逻辑网络适配器编号数组。,Process32Next()函数,调用Process32Next()函数可以从进程快照中获取下一个进程的信息,函数原型如下:BOOL WINAPI Process32Next(HANDLE hSnapshot,、/之前调用createtoolhelp32napshot()函数得到的进程快照句柄 LPPROCESSENTRY32 lppe/包含进程信息的结构体);如果函数执行成功
13、,则返回TRUE;否则返回FALSE。,【例7.4】,利用进程快照枚举当前Windows运行进程的信息,代码如下:#include stdafx.h#include windows.h#include tlhelp32.hint _tmain(int argc,_TCHAR*argv)PROCESSENTRY32 pe;/设置结构体pe的大小pe.dwSize=sizeof(pe);/获取系统内进程的快照HANDLE hProcessSnap=:CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);if(hProcessSnap=INVALID_HAND
14、LE_VALUE)printf(CreateToolhelp32Snapshot error.n);return-1;,接上,/遍历进程快照,显示每个进程的信息BOOL bMore=:Process32First(hProcessSnap,4ASTAT结构体,ASTAT结构体用于描述网络适配器的状态和名字信息,定义代码如下:typedef struct ADAPTER_STATUS adapt;NAME_BUFFER NameBuff30;ASTAT;参数adapt表示网络适配器的状态信息,参数NameBuff表示网络适配器中保存的本地网络名字信息。,【例7.4】的运行结果,7.2.3 终止进
15、程,进程从主函数的第一行代码开始执行,直到主函数结束时终止;也可以强制结束一个进程。当进程被终止时,系统会进行下面的操作:进程中的所有线程都被标记为“终止”状态;分配给进程的所有资源都会被释放掉;所有与该进程相关的内核对象都会被关闭;从内存中移除该进程的代码;系统设置进程的退出代码;将该进程对象设置为“受信”(Sigaled)状态。,GetExitCodeProcess()函数,调用GetExitCodeProcess()函数可以获取进程的终止状态,函数原型如下:BOOL WINAPI GetExitCodeProcess(_inHANDLE hProcess,/进程句柄 _outLPDWOR
16、D lpExitCode/用于接收进程的终止状态);如果函数执行成功,则返回TRUE;否则返回FALSE。当进程在运行中时,其终止状态为STILL_ACTIVE。当进程被终止时,其终止状态变成退出代码。,ExitProcess()函数,在进程中调用ExitProcess()函数终止其自身中所有的线程,函数原型如下:VOID WINAPI ExitProcess(_inUINT uExitCode/退出代码);,TerminateProcess()函数,调用TerminateProcess()函数可以终止指定的进程,函数原型如下:BOOL WINAPI TerminateProcess(_inH
17、ANDLE hProcess,/要终止的进程句柄 _inUINT uExitCode/退出代码);,7.3 进程间通信,7.3.1 通过自定义消息进行通信7.3.2 通过管道进行通信7.3.3 使用互斥体7.3.4 通过共享内存进行通信,7.3.1 通过自定义消息进行通信,1定义自定义消息的代码2发送消息3消息处理函数,1定义自定义消息的代码,为了唯一标识自定义消息,需要为其定义一个消息代码。自定义的消息代码都比WM_USER要大,因为0 WM_USER-1是保留给系统消息使用。可以使用下面的代码定义一个自定义消息WM_MY_MESSAGE:#define WM_MY_MESSAGE(WM_U
18、SER+100),2发送消息,调用PostMessage()函数将消息放置到与创建指定窗口的进程相关联的消息队列中,函数不需要等待接收方接受和处理消息就直接返回。函数原型如下:BOOL PostMessage(HWND hWnd,/接收消息的窗口句柄,使用HWND_BROADCAST表示所有顶层窗口 UINT Msg,/发送消息的代码 WPARAM wParam,/指定消息的附加信息 LPARAM lParam/指定消息的附加信息);,FindWindow()函数,HWND FindWindow(LPCTSTR lpClassName,/窗口类名,通常为NULL LPCTSTR lpWindo
19、wName/要查找窗口的标题);,3消息处理函数,在接收端需要设计一个消息处理函数,它的格式如下:LRESULTOnMyMsg(WPARAM wParam,LPARAM lParam)/处理代码return 0;参数wParam和lParam用于接收PostMessage()函数发送消息时指定的参数。,将消息与其处理函数映射起来,定义消息处理函数后还要将消息与其处理函数映射起来。在每个MFC对话框对应的.cpp文件中,都在BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP()宏之间定义消息与其处理函数映射的,例如:BEGIN_MESSAGE_MAP(CReceiverDlg,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 中的 进程 管理
链接地址:https://www.31ppt.com/p-5664552.html