7.5 通过API判断进程状态

通过,api,判断,进程,状态 · 浏览次数 : 9

小编点评

**进程状态判断** 进程状态的判断包括以下步骤: 1. **枚举系统内的所有进程信息**,并将该进程名转换为小写。 2. **使用 `strcmp` 函数比较进程名**,如果发现继承存在,则返回该进程的 PID 信息。 3. **创建或打开互斥量对象**,用于控制对某个共享资源的访问。 4. **判断指定进程是否为 64 位进程**。 5. **根据进程状态做出决策**,例如显示信息、退出程序等。 **代码示例** ```c #include #include #include // 获取进程状态 HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName) { HANDLE hMutex = NULL; hMutex = CreateMutex(lpMutexAttributes, bInitialOwner, lpName); return hMutex; } // 判断是否重复运行 BOOL IsAlreadyRun() { HANDLE hMutex = NULL; hMutex = CreateMutex(NULL, FALSE, "RUN"); if (hMutex) { if (ERROR_ALREADY_EXISTS == GetLastError()) return TRUE; CloseHandle(hMutex); return FALSE; } return FALSE; } // 判断指定进程是否为 64 位进程 BOOL Is64BitPorcess(DWORD dwProcessID) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID); if (hProcess) { typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process"); if (NULL != fnIsWow64Process) { BOOL bIsWow64 = FALSE; fnIsWow64Process(hProcess, &bIsWow64); CloseHandle(hProcess); if (bIsWow64) return FALSE; else return TRUE; } } return FALSE; } int main() { // 获取进程状态 PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); BOOL bMore = Process32First(hProcessSnap, &pe32); // 打印进程信息 while (bMore) { printf("进程PID: %5d 是否64位: %d 进程名称: %s\n", pe32.th32ProcessID, Is64BitPorcess(pe32.th32ProcessID), pe32.szExeFile); bMore = Process32Next(hProcessSnap, &pe32); } // 关闭互斥量对象 CloseHandle(hProcessSnap); return 0; } ```

正文

进程状态的判断包括验证进程是否存在,实现方法是通过枚举系统内的所有进程信息,并将该进程名通过CharLowerBuff转换为小写,当转换为小写模式后则就可以通过使用strcmp函数对比,如果发现继承存在则返回该进程的PID信息,否则返回-1。

int GetProcessStatus(const char *procressName)
{
  char pName[MAX_PATH];
  strcpy(pName, procressName);                           // 拷贝数组
  CharLowerBuff(pName, MAX_PATH);                        // 将名称转换为小写
  
  PROCESSENTRY32 currentProcess;                                    // 存放快照进程信息的一个结构体
  currentProcess.dwSize = sizeof(currentProcess);                   // 在使用这个结构之前,先设置它的大小
  HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 给系统内的所有进程拍一个快照

  if (INVALID_HANDLE_VALUE != hProcess)
  {
    BOOL bMore = Process32First(hProcess, &currentProcess);
    while (bMore)
    {
      CharLowerBuff(currentProcess.szExeFile, MAX_PATH);        // 将进程名转换为小写
      if (strcmp(currentProcess.szExeFile, pName) == 0)         // 比较是否存在此进程
      {
        CloseHandle(hProcess);
        return currentProcess.th32ProcessID;
      }
      bMore = Process32Next(hProcess, &currentProcess);
    }
    CloseHandle(hProcess);
  }
  return -1;
}

有时候我们需要判断自身进程是否被重复运行了,这种需求在软件开发中经常会遇到,通常该需求可以使用CreateMutex创建或打开一个互斥量对象(Mutex Object),在多线程/进程的环境下,互斥量可用于控制对某个共享资源的访问。其函数声明如下:

HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL                  bInitialOwner,
  LPCTSTR               lpName
);

其中,lpMutexAttributes 是用于指定新创建的互斥量的安全描述符的指针;bInitialOwner 表示一个布尔值,指定初始所有权标记,为 TRUE 表示调用线程将拥有该互斥量,否则表示它不属于调用线程;lpName 是可选的,用于命名互斥体,以使得其他线程或者进程可以通过这个名字来打开该互斥量对象。

CreateMutex 函数会返回一个内核对象句柄,用于在之后对该互斥体进行引用和操作,通过使用互斥体可以很容易的实现对进程运行状态的判断。

#include <Windows.h>
#include <stdio.h>

// 判断是否重复运行
BOOL IsAlreadyRun()
{
  HANDLE hMutex = NULL;
  hMutex = CreateMutex(NULL, FALSE, "RUN");
  if (hMutex)
  {
    if (ERROR_ALREADY_EXISTS == GetLastError())
      return TRUE;
  }
  return FALSE;
}

int main(int argc, const char * argv[])
{
  if (IsAlreadyRun() == TRUE)
    printf("重复运行 \n");
  else
    printf("没有重复运行 \n");

  system("pause");
  return 0;
}

对进程位数的判断也是有必要的,通常在Windows系统下进程位数的有多种方法实现,第一种方式GetNativeSystemInfo调用该函数并判断函数内的特定成员,即可得到当前系统是否为64位,当然通过使用Is64BitPorcess函数也可实现对特定进程的判断,此方式实现原理是通过调用IsWow64Process函数实现;

#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>

// 判断自身系统是否为64位
BOOL IsSelf64bitSystem()
{
  SYSTEM_INFO si;
  GetNativeSystemInfo(&si);
  if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
    si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
    return TRUE;
  else
    return FALSE;
}

// 判断指定进程是否为64位进程
BOOL Is64BitPorcess(DWORD dwProcessID)
{
  HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);
  if (hProcess)
  {
    typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)
      GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process");
    if (NULL != fnIsWow64Process)
    {
      BOOL bIsWow64 = FALSE;
      fnIsWow64Process(hProcess, &bIsWow64);
      CloseHandle(hProcess);
      if (bIsWow64)
        return FALSE;
      else
        return TRUE;
    }
  }
  return FALSE;
}

int main(int argc, char *argv[])
{
  PROCESSENTRY32 pe32;
  pe32.dwSize = sizeof(pe32);

  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  BOOL bMore = Process32First(hProcessSnap, &pe32);

  while (bMore)
  {
    printf("进程PID: %5d 是否64位: %d 进程名称: %s\n",
      pe32.th32ProcessID, Is64BitPorcess(pe32.th32ProcessID), pe32.szExeFile);

    bMore = Process32Next(hProcessSnap, &pe32);
  }
  system("pause");
  return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/7821bd48.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

与7.5 通过API判断进程状态相似的内容:

7.5 通过API判断进程状态

进程状态的判断包括验证进程是否存在,实现方法是通过枚举系统内的所有进程信息,并将该进程名通过`CharLowerBuff`转换为小写,当转换为小写模式后则就可以通过使用`strcmp`函数对比,如果发现继承存在则返回该进程的PID信息,否则返回-1。

[转帖]7.5 TiKV 磁盘空间占用与回收常见问题

https://book.tidb.io/session4/chapter7/compact.html TiKV 作为 TiDB 的存储节点,用户通过 SQL 导入或更改的所有数据都存储在 TiKV。这里整理了一些关于 TiKV 空间占用的常见问题 TiKV 的空间放大 监控上显示的 Number

5.7 汇编语言:汇编高效乘法运算

汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。乘法指令是一种在CPU中实现的基本算术操作,用于计算两个数的乘积。在汇编语言中,乘法指令通常是通过`mul(无符号乘法)`和`imul(有符号乘法)`这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多

[转帖]Sql Server中通过sql命令获取cpu占用及产生锁的sql

https://www.jb51.net/article/266255.htm 这篇文章主要介绍了Sql Server中通过sql命令获取cpu占用及产生锁的sql,需要的朋友可以参考下 获取SQLSERVER中产生锁的SQL语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1

[转帖]【压测】通过Jemeter进行压力测试(超详细)

文章目录 背景一、前言二、关于JMeter三、准备工作四、创建测试4.1、创建线程组4.2、配置元件4.3、构造HTTP请求4.4、添加HTTP请求头4.5、添加断言4.6、添加察看结果树4.7、添加Summary Report4.8、测试计划创建完成 五、执行测试计划总结 背景 通过SpringC

项目管理之八大绩效域------笔记(四)

18.5 项目工作绩效域 在整个项目期间 一、预期目标: ①高效且有效的项目绩效; ②适合项目和环境的项目过程; ③干系人适当的沟通和参与; ④对实物资源进行了有效管理; ⑤对采购进行了有效管理; ⑥有效处理了变更; ⑦通过持续学习和过程改进提高了团队能力. 二、绩效要点: 1.项目过程 1.1 需

软件设计模式系列之十九——中介者模式

@目录1 模式的定义2 举例说明3 结构4 实现步骤5 代码实现6 典型应用场景7 优缺点8 类似模式9 小结 1 模式的定义 中介者模式是一种行为型设计模式,它用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。这种模式有助于减少对象之间的耦合性,使系统更加可维护和扩展。中介者

7.1 实现进程内存块枚举

在`Windows`操作系统中,每个进程的虚拟地址空间都被划分为若干内存块,每个内存块都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过`VirtualQueryEx`函数查询得到。该函数可用于查询进程虚拟地址空间中的内存信息的函数。它的作用类似于`Windows`操作系统中的`Task...

7.5 C/C++ 实现链表队列

链表队列是一种基于链表实现的队列,相比于顺序队列而言,链表队列不需要预先申请固定大小的内存空间,可以根据需要动态申请和释放内存。在链表队列中,每个节点包含一个数据元素和一个指向下一个节点的指针,头节点表示队头,尾节点表示队尾,入队操作在队尾插入元素,出队操作在队头删除元素,队列的长度由节点数量决定。由于链表队列没有容量限制,因此可以处理任意数量的元素,但是相比于顺序队列,链表队列的访问速度较慢,因

.NET周刊【7月第5期 2023-07-30】

## 国内文章 ### PaddleSharp:跨越一年的版本更新与亮点 https://www.cnblogs.com/sdflysha/p/20230724-paddlesharp-in-a-year.html 我始终坚信,开源社区是技术进步的重要推动力,也是我抽出我业余时间,投入到`Paddl