先阐述一下
进程和
线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。
概念
进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是
系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有
任何运行的含义,只是一个静态实体。而
进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
线程(Thread)是
进程的一个实体,是CPU调度和分派的基本单位。
线程不能够独立执行,必须依存在
应用程序中,由应用程序提供多个线程执行控制。
二者关系
线程和
进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一
内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程可与属于同一
进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有
系统资源,只拥有一点在运行中必不可少的信息(如
程序计数器、一组
寄存器和栈)。
操作系统分类
(3)
多进程、
多线程,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是这种
操作系统;
引入线程的好处
(2)同一
进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。另外,
线程的出现还有以下几个原因:
①
并发程序的并发执行,在多处理环境下更为有效。一个
并发程序可以建立一个
进程,而这个并发程序中的若干并发程序段就可以分别建立若干
线程,使这些线程在不同的处理机上执行。
进程间通信(IPC)
(2)
动态数据交换(Dynamic Data Exchange);
(3)部件对象模型(Component Object Model);
(4)文件映射(File Mapping);
(5)邮件槽(Mail Slots);
(6)管道(Pipes);
(8)
远程过程调用(Remote Procedure Call);
(9)WM_COPYDATA消息(WM_COPYDATA Message)。
获取进程信息
在WIN32中,可使用在PSAPI .DLL中提供的Process status Helper函数帮助我们获取
进程信息。
|
BOOL EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD*cbNeeded);
|
参数lpidProcess:一个足够大的DWORD类型的
数组,用于存放
进程的ID值;
参数cb:存放进程ID值的数组的最大长度,是一个DWORD类型的数据;
参数cbNeeded:指向一个DWORD类型数据的
指针,用于返回
进程的数目;
函数返回值:如果调用成功,返回TRUE,同时将所有
进程的ID值存放在lpidProcess参数所指向的
数组中,进程个数存放在cbNeeded参数所指向的
变量中;如果调用失败,返回FALSE。
(2)GetModuleFileNameExA()函数可以实现通过
进程句柄获取
进程文件名,其原型为:
|
DWORD GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule,LPTSTR lpstrFileName, DWORD nsize);
|
参数hProcess:接受
进程句柄的参数,是HANDLE类型的
变量;
参数hModule:
指针型参数,在本文的程序中取值为NULL;
参数lpstrFileName:LPTSTR类型的
指针,用于接受主调函数传递来的用于存放
进程名的字符
数组指针;
参数nsize:lpstrFileName所指
数组的长度;
函数返回值:如果调用成功,返回一个大于0的DWORD类型的数据,同时将hProcess所对应的
进程名存放在lpstrFileName参数所指向的
数组中;如果调用失败,则返回0。
通过下列代码就可以遍历
系统中的
进程,获得进程列表:
|
//获取当前进程总数
EnumProcesses(process_ids, sizeof(process_ids), &num_processes);
//遍历进程
for (int i = 0; i < num_processes; i++)
{
//根据进程ID获取句柄
process[i] = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0,
process_ids[i]);
//通过句柄获取进程文件名
if (GetModuleFileNameExA(process[i], NULL, File_name, sizeof(fileName)))
cout << fileName << endl;
}
|