当前位置:文档之家› windows多进程编程

windows多进程编程

windows多进程编程
windows多进程编程

一、进程的概念

进程是是一个正在运行的程序的实例(飘~~~),是系统分配资源的单位(线程是执行的单位),包括内存,打开的文件、处理机、外设等,进程由两部分组成:

1、进程的内核对象:即我们通常所讲的PCB(进程控制块),该结构只能由该内核访问,他是操作系统用来管理进程的一个数据结构,操作系统通过该数据结构来感知和管理进程;它的成员负责维护进程的各种信息,包括进程的状态(创建、就绪、运行、睡眠、挂起、僵死等)、消息队列等;同时也是系统用来存放关于进程的统计信息的地方。

注:具体结构参照Linux的task_struct数据结构。

2、进程的地址空间:包含所有可执行模块或DLL模块的代码和数据,以及动态内存分配的空间,如线程堆栈和堆分配的空间。共有4G,0-2G为用户区,2-4G 为系统区。

二、进程的创建过程

1、系统创建进程内核对象(PCB进程控制块)。

2、系统为新进程创建虚拟地址空间,帮将可执行文件或任何必要的DLL文件的代码和数据加载到该进程的地址空间。

3、系统为新进程的主线程创建一个线程内核对象(TCB线程控制块)。

4、通过执行C/C++运行期启动代码,该主线程开始运行。注:在Windows环境下,尽量用多线程而不是多进程。

三、与进程相关的API

1、创建进程

BOOL CreateProcess(

PCTSTR psApplicationName, //可执行文件的名字

PTSTR pszCommandLine, //命令行字符串

PSECURITY_ATTRIBUTES psaProcess, //进程对象的安全性

PSECURITY_ATTRIBUTES psaThread, //线程对象的安全性

BOOL bInheritHandles, //句柄可继承性

DWORD fdwCreate, //标识符(优先级)

PVOID pvEnvironment, //指向环境字符串

PCTSTR pszCurDir, //子进程当前目录

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo); //进程线程句柄及ID

2、打开进程

HANDLE OpenProcess(

DWORD dwDesiredAccess, //访问安全属性

BOOL bInheritHandle, //继承属性

DWORD hProcessId); //进程ID

注:获取hPronessId指定的进程的内核对象的句柄

3、终止进程

(1)、主线程的进入点函数返回

(2)、进程自己终止自己

VOID ExitProcess(

UINT fuExitCode); //退出代码

(3)、终止自身进程或其他进程

BOOL TerminateProcess(

HANDLE hProcess, //进程句柄

UINT fuExitCode); //退出代码

三、与进程相关的API(续)

4、获取进程的可执行文件或DLL对应的句柄

HMODULE GetModuleHandle(

PCTSTR pszModule); //模块名称

注:当参数传NULL时获取的是进程的地址空间中可执行文件的基地址。

5、获取与指定窗口关联在一起的一个进程和线程标识符

HANDLE GetWindowThreadProcessId(

HWND hWnd, //窗口句柄

LPDWORD lpdwProcessId); //与该窗口相关的进程ID

6、获取进程的运行时间

Bool GetProcessTimes(

HANDLE hProcess, //进程句柄

PFILETIME pftCreationTime, //创建时间

PFILETIME pftExitTime, //退出时间

PFILETIME pftKernelTime, //内核时间

PFILETIME pftUserTime); //用户时间

注:返回的时间适用于某个进程中的所有线程(甚至已经终止运行的线程)。

7、获取当前进程的一个伪句柄

HANDLE GetCurrentProcess();

注:该函数获取当前进程的伪句柄,通常情况值为-1,只能标识当前进程内核对象,可以复制,但不可继承。不必调用CloseHandle()函数来关闭这个句柄。

8、将进程的伪句柄转换为实句柄

HANDLE DuplicateHandle(

GetCurrentProcess(),

GetCurrentProcess(),

GetCurrentProcess(),

&hProcess,

0,

FALSE ,

DUPLICATE_SAME_ACCESS);

9、获取当前进程ID

DWORD GetCurrentProcessId();

10、获取进程优先级

DWORD GetPriorityClass(

HANDLE hProcess);

11、修改进程的优先级类

BOOL SetPriorityClass(

HANDLE hProcess, //进程句柄

DWORD fdwPriority); //相对进程优先级

注1:相对线程优先级

实时: REALTIME_PRIORITY_CLASS

高: HIGH_PRIORITY_CLASS

高于正常; ABOVE_NORMAL_PRIORITY_CLASS

正常: NORMAL_PRIORITY_CLASS

低于正常: BELOW_NORMAL_PRIORITY_CLASS

空闲: IDLE_PRIORITY_CLASS

注2:只要拥有进程的句柄和足够的权限,就能够修改系统中运行的任何进程的优先级类。

12、获取进程句柄计数

BOOL GetProcessHandleCount(

HANDLE hProcess, //句柄

PDWORD pdwHandleCount); //句柄计数

13、获取环境块

DWORD GetEnvironmentVariable(

LPCTSTR lpName, //环境变量的名字

LPTSTR lpValue, //存放返回字符串的缓冲区

DWORD cchValue); //缓冲区的大小

注:返回值为返回字符串的长度,当缓存不足时返回所需字符串的长度

14、设置环境块

BOOL SetEnvironmentVariable(

LPCTSTR lpName, //环境变量的名字

LPCTSTR lpValue); //存放变量值字符串的缓冲区

一、线程的概念

进程是操作系统分配资源的单位,而线程是操作系统调度的单位,进程是静态的,而线程是活动的。与进程一样,线程由两部分构成。

1、线程的内核对象(TCB),一个数据结构,操作系统通过它对线程实施管理,同时也是系统用来存放线程统计信息的地方。

2、线程堆栈,用于维护线程爱执行代码时需要的所有函数的参数和局部变量。

二、与线程相关的API

1、创建线程

HANDLE CreateThread(

PSECURITY_ATTRIBUTES psa, //安全属性

DWORD cbStack, //堆栈大小

PTHREAD_START_POUTINF pfnSatrtAddr, //函数地址

PVOID pvParam, //函数参数

DWORD fdwCreate, //创建标志

PDWORD pdwThreadID); //新线程的线程ID

2、终止线程

(1)、从线程函数返回

(2)、线程自己终止自己

VOID ExitThread(

UINT fuExitCode); //退出代码

(3)、终止自身进程或其他进程

BOOL TerminateThread(

HANDLE hThread, //进程句柄

UINT fuExitCode); //退出代码

3、获取线程句柄

HANDLE GetCurrentThread();

4、查询自己的线程时间

FILETIME GetThreadTimes(

HANDLE hThread, //线程句柄

FILETIME lpCreationTime, //装载线程的创建时间

FILETIME lpExitTime, //装载线程的中止时间

FILETIME lpKernelTime, //装载线程花在内核模式上的总时间 FILETIME lpUserTime); //装载线程花在用户模式上的总时间5、获取线程自身ID

BOOL GetCurrentThreadId();

6、暂停线程的运行

DWORD SuspendThread(

HANDLE hThread);

7、唤醒线程

DWORD ResumeThread(

HANDLE hThread);

8、使进程睡眠

VOID Sleep(

DWORD dwMilliseconds); //睡眠时间9、获取结构环境

BOOL GetThreadContext(

HANDLE hThread,

PCONTEXT pContext);

10、获取线程优先级

Int GetThreadPriority(

HANDLE hThread);

11、修改刚创建的线程的优先级

BOOL SetThreadPriority(

HANDLE hThread, //线程句柄

Int nPriority); //相对线程优先级注:相对线程优先级

关键时间: THREAD_PRIORITY_TIME_CRITICAL

最高: THREAD_PRIORITY_HIGHEST

高于正常; THREAD_PRIORITY_ABOVE_NORMAL

正常: THREAD_PRIORITY_NORMAL

低于正常: THREAD_PRIORITY_BELOW_NORMAL

最低: THREAD_PRIORIRY_LOWEST

空闲: THREAD_PRIORITY_IDLE

注:使用方法,必须以挂起方式创建线程,修改完毕后唤醒线程

DWORD dwThreadID;

HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL,

CREATE_SUSPENDED,

&dwThreadID);

SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST);

ResumeThread(hThread);

CloseHandle(hThread);

注:在线程创建函数中没有提供线程优先级的设置,当线程刚刚创建时,其相对线

程优先级总是设置为正常优先级。

三、 C/C++中创建线程

在C/C++中若要创建一个新线程,建议调用C/C++运行期库函数,而不是操作系统的CreateThread函数。

Unsigned long _beginthreadex(

Void *security,

Unsigned stack_size,

Unsigned (*start_address)(void *),

Void *arglist,

Unsigned initflag,

Unsigned *thrdaddr);

相关主题
文本预览
相关文档 最新文档