概念
进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是
系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有
任何运行的含义,只是一个静态实体。而
进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
二者关系
线程和
进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一
内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程可与属于同一
进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有
系统资源,只拥有一点在运行中必不可少的信息(如
程序计数器、一组
寄存器和栈)。
操作系统分类
引入线程的好处
编辑本段进程作用
进程间通信(IPC)
Win32
进程间通信的方式主要有:
(1)
剪贴板(Clip Board);
(2)
动态数据交换(Dynamic Data Exchange);
(3)部件对象模型(Component Object Model);
(4)文件映射(File Mapping);
(5)邮件槽(Mail Slots);
(6)管道(Pipes);
(7)Win32
套接字(Socket);
(8)
远程过程调用(Remote Procedure Call);
(9)WM_COPYDATA消息(WM_COPYDATA Message)。
获取进程信息
在WIN32中,可使用在PSAPI .DLL中提供的Process status Helper函数帮助我们获取
进程信息。
(1)
EnumProcesses()函数可以获取
进程的ID,其原型为:
BOOL EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD*cbNeeded);
|
DWORD GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule,LPTSTR lpstrFileName, DWORD nsize);
|
参数hModule:
指针型参数,在本文的程序中取值为NULL;
参数nsize:lpstrFileName所指
数组的长度;
//获取当前进程总数
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;
}
|