由进程名取得进程ID

1.此处进程名是指进程可执行文件的名称(任务管理器进程列表中显示的映像名称);

2.windows下没有现成的API,实现思路采用CreateToolhelp32Snapshot函数创建进程快照然后依次遍历比较;

3.使用CreateToolhelp32Snapshot函数需要包含头文件#include<tlhelp32.h>

4.具体原理讲解:

HANDLE WINAPI CreateToolhelp32Snapshot(
  _In_ DWORD dwFlags,       //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
  _In_ DWORD th32ProcessID  //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或                   获取当前进程快照时可以设为0
);

1.dwFlags,标志位,可取如下值:
TH32CS_INHERIT        ——表示快照句柄是可继承的
TH32CS_SNAPALL        ——包括系统中的所有进程和线程,以及th32ProcessID中指定的进程的堆和模块 
TH32CS_SNAPHEAPLIST   ——包括快照中th32ProcessID中指定的进程的所有堆(参阅:Heap32ListFirst)
TH32CS_SNAPMODULE     ——包括快照中th32ProcessID中指定的进程的所有模块
TH32CS_SNAPMODULE32   ——包括从64位进程调用时快照中的th32ProcessID中指定的进程的所有32位模块
TH32CS_SNAPPROCESS    ——包括快照中系统中的所有进程,要枚举进程,请参阅Process32First
TH32CS_SNAPTHREAD     ——包括快照中系统中的所有线程,要枚举线程,请参阅Thread32First

2.th32ProcessID,一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0。
当指定TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32或TH32CS_SNAPALL值时,使用此参数。否则,它将被忽略,并且所有进程都包括在快照中。

3.返回值
如果函数成功,它将返回一个打开的句柄到指定的快照。 
如果函数失败,则返回INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError。可能的错误代码包括ERROR_BAD_LENGTH。                

这里我们要获取系统中所有进程,所以dwFlags参数传入TH32CS_SNAPPROCESS,th32ProcessID传入NULL,创建系统快照。  

5.得到系统进程快照句柄后,需要调用Process32First函数查找系统进程快照中的第一个进程,函数格式如下:

BOOL Process32First(
                    HANDLE hSnapshot,
                    LPROCESSENTRY32 lppe
                   );

 再调用Process32Next函数列出系统中其它进程,格式如下:

BOOL Process32Next(
                    HANDLE hSnapshot,
                    LPROCESSENTRY32 lppe
                   );

两个函数的参数是一样的,其中hSnapshot是由CreateToolHelp32Snapshot函数返回的系统进程快照的句柄;而lppe是指向PROCESSENTRY的结构体指针,进程的详细信息保存在结构体中。PROCESSENTRY32结构体定义如下:

6.具体实现代码

PROCESSENTRY32结构如下:     
typedef struct tagPROCESSENTRY32{     
  DWORD   dwSize;              //结构大小;     
  DWORD   cntUsage;            //此进程的引用计数;     
  DWORD   th32ProcessID;       //进程ID;     
  DWORD   th32DefaultHeapID;   //进程默认堆ID;     
  DWORD   th32ModuleID;        //进程模块ID;     
  DWORD   cntThreads;          //此进程开启的线程计数;     
  DWORD   th32ParentProcessID; //父进程ID;     
  LONG   pcPriClassBase;       //线程优先权;     
  DWORD   dwFlags;             //保留;     
  char   szExeFile[MAX_PATH];  //进程全名;     
  }PROCESSENTRY32;

DWORD GetProcessIdByName(TCHAR *pProcess)
{

   DWORD ProcessId = NULL;
   PROCESSENTRY32 lppe;//PROCESSENTRY32结构体如参考上面所示
   //在使用这个结构前,先设置它的大小
   lppe.dwSize = sizeof(lppe);
   //给系统内所有的进程拍个快照
   HANDLE hProcessSnap =    ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
   if(hProcessSnap == INVALID_HANDLE_VALUE)
   {
     printf("CreateToolhelp32Snapshot调用失败。\n");
     return NULL;
   }
   //遍历进程快照,轮流显示每个进程的信息
   BOOL bMore = ::Process32First(hProcessSnap, &lppe);
   while(bMore)
   {
     if(strcmp(lppe.szExeFile, pProcess) == 0)
     {
       ProcessId = lppe.th32ProcessID;
       break;
     }
     bMore = ::Process32Next(hProcessSnap, &lppe);
   }
   //清理hProcessSnap对象
   ::CloseHandle(hProcessSnap);
   //返回匹配的进程id,如果没有匹配则返回NULL
   return ProcessId;
}

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,可以通过进程ID获取进程名。Linux系统中的每个进程都有一个唯一的进程ID(PID),可以使用这个PID来获取进程名。 方法一:通过/proc文件系统获取进程名 在Linux系统的/proc目录下,有一个以进程ID命名的文件夹,进入该文件夹后,可以读取该文件夹下的status文件,其中包含了很多与进程相关的信息,包括进程名。可以使用cat命令或者读取文件的方式来获取进程名,例如: ```shell cat /proc/PID/status | grep Name ``` 其中,PID进程的实际进程ID,Name是进程名。 方法二:使用ps命令获取进程名 可以使用ps命令来获取进程的一些信息,其中包括进程名。可以使用以下命令来获取指定进程ID对应的进程名: ```shell ps -p PID -o comm= ``` 其中,PID进程的实际进程ID,comm表示进程名。 在使用以上方法获取进程名时,需要注意以下几点: 1. 只有在当前用户有足够权限的情况下,才能够获取其他用户创建的进程进程名。 2. 这些方法都是通过读取系统文件或者执行系统命令来获取进程名的,因此可能会对系统性能产生一定的影响,尤其是对于大量进程的系统。 3. 在获取进程名之前,需要确保该进程仍然存在,否则无法获取到进程名。 综上所述,可以通过上述两种方法来获取Linux系统中任意进程进程名,从而实现根据进程ID获取进程名的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值