7.5 通过API判断进程状态
进程状态的判断包括验证进程是否存在,实现方法是通过枚举系统内的所有进程信息,并将该进程名通过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, ¤tProcess);while (bMore){CharLowerBuff(currentProcess.szExeFile, MAX_PATH); // 将进程名转换为小写if (strcmp(currentProcess.szExeFile, pName) == 0) // 比较是否存在此进程{CloseHandle(hProcess);return currentProcess.th32ProcessID;}bMore = Process32Next(hProcess, ¤tProcess);}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");elseprintf("没有重复运行 \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;elsereturn 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;elsereturn 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;
}
本文作者: 王瑞
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章:
7.5 通过API判断进程状态
进程状态的判断包括验证进程是否存在,实现方法是通过枚举系统内的所有进程信息,并将该进程名通过CharLowerBuff转换为小写,当转换为小写模式后则就可以通过使用strcmp函数对比,如果发现继承存在则返回该进程的PID信息,…...
你写过的最蠢的代码是?
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...
MySQL与PostgreSQL对比
MySQLPostgreSQL数据类型支持支持JSON,但不如PostgreSQL支持更多的数据类型,如数组、hstore、JSON、JSONB、范围类型等扩展性有一些扩展性,但不如PostgreSQL支持自定义数据类型、函数、操作符,具有强大的扩展性SQL兼容性遵循SQL标…...
AD拼板技巧
AD拼板设置 如图,有一个需要拼板的PCB,想要在生产是拼接生产,节省材料。 操作如下: 1、全选如下,按复制CtrlC。 2、把输入法调整至英文,按快捷键E(先), A(后…...
Android滑动片段
本文所有的代码均存于 https://github.com/MADMAX110/BitsandPizzas 回到BitsandPizzas应用,之前已经创建过创建订单和发出反馈等功能。 修改披萨应用,让它使用标签页导航。在工具条下显示一组标签页,每个选项对应一个不同的标签页。用户单击…...
【力扣-每日一题】337. 打家劫舍 III
class Solution { public:pair<int,int> dfs_rob(TreeNode *root){//如果为根节点if(rootnullptr)return {0,0};auto [l,l_n]dfs_rob(root->left);auto [r,r_n]dfs_rob(root->right);int ol_nr_nroot->val;//当前节点偷,所获得的利益,子节点不能偷in…...
Docker部署FastDFS分布式存储
1、准备工作 docker pull qinziteng/fastdfs:5.05 Pwd"/data/software/fastdfs" mkdir ${Pwd}/{storage,tracker} -p2、创建TEST容器,将fastdfs目录COPY到本地,方便后续维护管理! docker run -id --name fastdfs qinziteng/fastd…...
MyBatis基础之SqlSession
SqlSession 线程安全问题 当你翻看 SqlSession 的源码时,你会发现它只是一个接口。我们通过 MyBatis 操作数据库,实际上就是通过 SqlSession 获取一个 JDBC 链接,然后操作数据库。 SqlSession 接口有 3 个实现类: #实现类1Defa…...
笔记本电脑没有麦克风,声音无法找到输入设备
新买的电脑没有扬声器,电脑声音没有输入设备,在开腾讯会议的时候才发现竟然有这个问题。 网上找原因,哎,找了一大堆每一个靠谱的 这让我想起来上次电脑没有热键的问题,所有问题的终极解决方案,都在源头那里…...
MySQL基础—从零开始学习MySQL
01.MySQL课程介绍_哔哩哔哩_bilibili 1、MySQL安装 以管理员身份运行cmd net start mysql80net stop mysql80 客户端连接 1). 方式一:使用MySQL提供的客户端命令行工具 2). 方式二:使用系统自带的命令行工具执行指令 mysql [-h 127.0.0.1] [-P 3…...
单例模式设计
目标: 1. 饿汉模式 2. 懒汉模式 3. 饿汉模式优化 目录 饿汉模式 懒汉模式 懒汉模式优化 饿汉模式 由名字我们就可以知道 "饿汉" 嘛,就比较急切,在类加载的时候就创建实例: 1. 写一个类,在本类中构造实…...
轻量型服务器能支撑多少人访问?
一、服务器配置影响访问人数 服务器的配置是影响轻量型服务器能够支撑的访问人数的关键因素之一。通常而言,轻量型服务器的配置普遍不高,适合小型团队或个人使用。如果服务器配置较低,那么支撑访问人数的能力也会受到限制。较为简单的应用程序…...
python: Sorting Algorithms
# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看:Python Sorting Algorithms # 描述: * https://www.programiz.com/dsa/counting-sort # * https://www.geeksforgeeks.org/sorting-algorithms/ # Author : geovindu,Geovin Du 涂…...
Python 安装js环境
在终端执行下面的命令 npm install jsdom jsdom 是一个实现了 DOM API 的 JavaScript 环境,用于在 Node.js 中模拟浏览器的 DOM 环境。execjs 使用 jsdom 这个模块来执行 JavaScript 代码。所以在你的系统中,需要先安装并配置好 jsdom 模块,…...
2023华为杯数模C题——大规模创新类竞赛评审方案研究
B题——大规模创新类竞赛评审方案研究 思路:采用数据分析等手段改进评分算法性能 完成情况(1-2问已经完成) 代码下载 问题一 在每个评审阶段,作品通常都是随机分发的,每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比…...
人工神经网络ANN:数学总结
一、内容 径向基函数(Radial basis function,RBF):一个取值仅依赖于到原点距离的实值函数,即。此外,也可以按到某一中心点c的距离来定义,即。 可以用于许多向函基数的和来逼近某一给定的函数&a…...
RabbitMQ的工作模式——WorkQueues
1.工作队列模式 生产者代码 public class Producer_WorkQueues1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133&qu…...
AOJ 0531 坐标离散化
一、题目大意 在(0<x<w,0<y<h)的坐标系里有多个矩形,把区域分成了多个部分,我们需要针对找出被矩形分割的连通的区块数量。 二、解题思路 这个题目其实和学DFS时候那个找出连通的水洼是一样的。只是这个地图比较大,…...
Python —— pytest框架
1、认识pytest框架 1、搭建自动化框架的思路与流程 1、搭建自动化测试框架的思路和流程,任意测试手段流程都是一致的:手工测试、自动化测试、工具测试 手工测试:熟悉业务 —— 写用例 —— 执行用例并记录结果 —— 生成测试报告自动化测试…...
IP地址欺骗的危害与后果
IP地址欺骗,也被称为IP地址伪装或IP地址欺诈,是一种网络攻击技术,旨在伪装或隐藏攻击者的真实IP地址。尽管这种技术可能有一些合法的用途,例如保护用户的隐私或绕过地理位置限制,但它也经常被恶意黑客用于不法行为。本…...
【算法日记】Day 9 动态规划专题——最长递增子序列问题及扩展
Abstract:#动态规划 #最长递增子序列 #二分查找 #排序 1. 题目 题目:LeetCode 354. 俄罗斯套娃信封核心思路:先将信封按宽度升序排序,若宽度相同则按高度降序排序。然后对排序后的高度序列求最长递增子序列(LIS&…...
图片格式转换效率革命:从繁琐流程到一键操作的技术突破
图片格式转换效率革命:从繁琐流程到一键操作的技术突破 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors/sa/Save-…...
从原理到实战:LRU缓存算法的核心机制与工程实践
1. LRU缓存算法的基础原理 最近最少使用(LRU)算法是每个后端工程师都应该掌握的缓存淘汰策略。我第一次在线上系统使用LRU时,发现它完美解决了我们的缓存击穿问题。简单来说,LRU就像图书馆里整理书籍的管理员——总是把最近被借阅…...
给嵌入式开发者的698协议实战拆解:从报文抓包到C语言解析(附代码)
给嵌入式开发者的698协议实战拆解:从报文抓包到C语言解析(附代码) 在智能电表与集中器通信领域,698协议正逐渐成为主流标准。不同于传统645协议的简单数据标识,698协议采用面向对象的设计思想,为开发者提供…...
93.91%压缩率背后的技术革命:CompressO如何解决企业级视频处理的效率困境
93.91%压缩率背后的技术革命:CompressO如何解决企业级视频处理的效率困境 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirr…...
旧衣堆积如山?爱裹回收免费上门,半小时搞定!
换季大扫除的时候,你是不是也经常遇到这样的烦恼:衣柜爆满、旧衣服不知道怎么处理、搬下楼太累、也不知道该扔到哪里?这些问题现在都有一个简单又高效的解决方案——爱裹回收。一句话总结它的最大亮点:免费上门 全品类 快速响应…...
Kubernetes集群的自动化运维实践
Kubernetes集群的自动化运维实践 🔥 硬核开场 各位技术老铁,今天咱们聊聊Kubernetes集群的自动化运维实践。别跟我扯那些理论,直接上干货!在云原生时代,Kubernetes已经成为容器编排的事实标准,但随着集群规…...
不用装软件!这款MicroPython浏览器 IDE :让你在手机上也能调试树莓派 Pico弛
1、普通的insert into 如果(主键/唯一建)存在,则会报错 新需求:就算冲突也不报错,用其他处理逻辑 回到顶部 2、基本语法(INSERT INTO ... ON CONFLICT (...) DO (UPDATE SET ...)/(NOTHING)) 语…...
OpenClaw 龙虾 = 效率倍增器 + 数字员工孵化器+附安装教程
作为一个每天和电脑打交道 12 小时的 IT 从业者,我用过不下 50 款 AI 工具,但能让我坚持用了 3 个月、每天都离不开的,只有OpenClaw 龙虾。很多人还把它当成普通的聊天机器人,这真的大错特错。OpenClaw 龙虾不是未来科技ÿ…...
笑不活了!学生自研反外挂系统,结果反手把自己“误封”了|从翻车到封神全过程
笑不活了!学生自研反外挂系统,结果反手把自己“误封”了|从翻车到封神全过程 文章目录笑不活了!学生自研反外挂系统,结果反手把自己“误封”了|从翻车到封神全过程事情起因:我想写个反外挂&…...
