C++之进程管理

目录

1、创建进程

2、获取指定进程PID

3、结束进程

4、进程枚举


进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,也是操作系统结构的基础。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

从理论角度看,进程是对正在运行的程序过程的抽象;从实现角度看,进程是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。

进程具有动态性,它是动态产生和消亡的。每一个进程都有它自己的地址空间,包括文本区域、数据区域和堆栈。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

进程与程序有本质的区别。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念,有一定的生命期。程序是永久的,进程是暂时的。进程更能真实地描述并发,而程序不能。此外,进程具有创建其他进程的功能,而程序没有。同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,即同一程序可以对应多个进程。

1、创建进程

在C++中创建Windows进程通常涉及到使用Windows API函数,特别是CreateProcess函数。这个函数允许你启动一个新的进程和它的主线程,并指定新进程的命令行、初始窗口状态、环境块等。

以下是一个简单的示例,展示了如何使用CreateProcess函数来创建一个新的Windows进程:

#include <windows.h>  #include <tchar.h>  #include <iostream>  int main() {    STARTUPINFO si;    PROCESS_INFORMATION pi;    ZeroMemory(&si, sizeof(si));    si.cb = sizeof(si);    ZeroMemory(&pi, sizeof(pi));    // 设置命令行参数,这里以notepad.exe为例      TCHAR cmdLine[] = _T("C:\\Windows\\System32\\notepad.exe");    // 创建进程      if (!CreateProcess(NULL,   // 不使用模块名          cmdLine,        // 命令行          NULL,           // 进程句柄不可继承          NULL,           // 线程句柄不可继承          FALSE,          // 设置句柄不继承标志          0,              // 无创建标志          NULL,           // 使用父进程的环境块          NULL,           // 使用父进程的驱动器和目录          &si,            // 指向STARTUPINFO结构的指针          &pi)           // 指向PROCESS_INFORMATION结构的指针          ) {        std::cerr << "CreateProcess failed (" << GetLastError() << ")." << std::endl;        return 1;    }    // 等待进程结束,以便看到notepad窗口      WaitForSingleObject(pi.hProcess, INFINITE);    // 关闭进程和线程句柄      CloseHandle(pi.hProcess);    CloseHandle(pi.hThread);    return 0;}

2、获取指定进程PID

在C++中,获取Windows进程的PID(进程标识符)通常涉及到使用Windows API函数来枚举系统中的进程,并检查每个进程的名称或其他属性以确定所需的PID。一个常用的函数是Toolhelp32Snapshot,它允许你获取一个快照,其中包含了当前系统中所有进程的信息。

以下是一个简单的示例,展示了如何使用Toolhelp32Snapshot和PROCESSENTRY32结构来获取特定进程名称的PID:

#include <windows.h>  
#include <tlhelp32.h>  
#include <iostream>  
#include <string>  
​
DWORD GetProcessIdByName(const std::wstring& processName) {DWORD pid = 0;HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot != INVALID_HANDLE_VALUE) {PROCESSENTRY32 pe32;pe32.dwSize = sizeof(PROCESSENTRY32);if (Process32First(hSnapshot, &pe32)) {do {if (std::wstring(pe32.szExeFile) == processName) {pid = pe32.th32ProcessID;break;}} while (Process32Next(hSnapshot, &pe32));}CloseHandle(hSnapshot);}return pid;
}
​
int main() {std::wstring processName = L"notepad.exe"; // 要查找的进程名称  DWORD pid = GetProcessIdByName(processName);if (pid != 0) {std::wcout << L"Process ID for " << processName << L" is: " << pid << std::endl;}else {std::wcout << L"Process not found." << std::endl;}return 0;
}

Process ID for notepad.exe is: 9428

3、结束进程

结束进程在计算机操作系统中指的是关闭或终止正在运行的程序或进程。当多个程序和进程在系统中同时运行时,为了控制和管理这些进程,操作系统提供了一些工具和方法来结束不需要或有问题的进程。结束进程的目的通常是为了解决以下问题:

占用过多资源:某个进程可能因为异常或错误而占用过多的CPU、内存或磁盘资源,导致其他进程无法正常运行。这时可以选择结束该进程,以释放资源并修复问题。

响应缓慢或无响应:某个进程可能会因为死锁、死循环或其他原因而长时间无响应,导致用户无法操作或其他进程受阻。结束该进程可以恢复系统的正常运行。

危险或恶意程序:某些程序可能会具有危险性或恶意行为,如病毒、恶意软件或未经授权的访问。这时,结束该进程可以避免该程序进一步对系统造成损害。

在C++中,关闭Windows进程通常涉及到使用Windows API函数,比如TerminateProcess,或者通过发送特定的信号给进程来请求其优雅地关闭。然而,更常见和推荐的做法是,如果可能的话,让进程自己处理关闭逻辑,比如通过接收一个退出信号或调用特定的关闭函数。

如果你确实需要从外部关闭一个进程,你可以使用TerminateProcess函数。这个函数会立即终止指定的进程及其所有线程。下面是一个简单的示例:

#include <windows.h>  
#include <tlhelp32.h>  
#include <iostream>  
​
bool CloseProcessByPID(DWORD pid) {HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);if (hProcess == NULL) {std::cerr << "OpenProcess failed (" << GetLastError() << ")." << std::endl;return false;}
​if (!TerminateProcess(hProcess, 999)) { // 999是退出码,可以自定义  std::cerr << "TerminateProcess failed (" << GetLastError() << ")." << std::endl;CloseHandle(hProcess);return false;}
​CloseHandle(hProcess);return true;
}
​
int main() {DWORD pid = 9428; // 这里替换为你要关闭的进程的PID  if (CloseProcessByPID(pid)) {std::cout << "Process with PID " << pid << " has been terminated." << std::endl;}else {std::cout << "Failed to terminate process with PID " << pid << "." << std::endl;}return 0;
}

Process with PID 9428 has been terminated.

4、进程枚举

在C++中,枚举Windows进程通常涉及到使用Windows API函数来获取系统中当前运行的所有进程的列表。CreateToolhelp32Snapshot函数是完成这项任务的一个常用方法,它允许你创建一个快照,其中包含了系统的状态信息,比如正在运行的进程。

下面是一个使用CreateToolhelp32Snapshot和PROCESSENTRY32结构来枚举Windows进程的示例代码:

#include <windows.h>  #include <tlhelp32.h>  #include <iostream>  #include <vector>  bool EnumerateProcesses(std::vector<DWORD>& processIds) {    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    if (hSnapshot == INVALID_HANDLE_VALUE) {        return false;    }    PROCESSENTRY32 pe32;    pe32.dwSize = sizeof(PROCESSENTRY32);    if (!Process32First(hSnapshot, &pe32)) {        CloseHandle(hSnapshot);        return false;    }    do {        processIds.push_back(pe32.th32ProcessID);    } while (Process32Next(hSnapshot, &pe32));    CloseHandle(hSnapshot);    return true;}int main() {    std::vector<DWORD> processIds;    if (EnumerateProcesses(processIds)) {        std::cout << "Enumerated processes:\n";        for (const auto pid : processIds) {            std::cout << "PID: " << pid << std::endl;        }    }    else {        std::cerr << "Failed to enumerate processes." << std::endl;    }    return 0;}

Enumerated processes:

PID: 0

PID: 4

PID: 100

PID: 432

PID: 704

PID: 808

PID: 832

PID: 904

PID: 912​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI论文速读 | 【综述】城市计算中跨域数据融合的深度学习:分类、进展和展望

题目&#xff1a;Deep Learning for Cross-Domain Data Fusion in Urban Computing: Taxonomy, Advances, and Outlook 作者&#xff1a;Xingchen Zou, Yibo Yan, Xixuan Hao, Yuehong Hu, Haomin Wen&#xff08;温皓珉&#xff09;, Erdong Liu, Junbo Zhang&#xff08;张钧…

进程之舞:操作系统中的启动、状态转换与唤醒艺术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

解决QT cc1plus.exe: error: out of memory allocating

QT中增加资源文件过大时&#xff0c;会编译不过&#xff0c;报错&#xff1a; cc1plus.exe: out of memory allocating 1073745919 bytes 使用qrc资源文件&#xff0c;也就是在QT的工程中添加资源文件&#xff0c;就是添加的资源文件&#xff08;如qrc.cpp&#xff09;会直接被…

简明固体物理--晶体的形成与晶体结构的描述

简明固体物理-国防科技大学 chapter 1 Formation of Crystal Contents and roadmapQuantum Mechanics and atomic structureElectronsOld quantum theoryMethod of Quantum MechanicsDistributing functions of micro-particles BindingCrystal structure and typical crystal…

Compose基础之State状态

Compose基础之State状态 Stateless和Stateful什么是Stateless&#xff0c;让我看下面代码Stateless它有什么特点呢Stateless它是如何实现避免无效重组的呢什么是Stateful&#xff0c;让我看下面代码 Compose中的State<T>State子类之MutableState 状态的恢复与持久化remem…

Go-Gin-example 第五部分 加入swagger

上一节链接 swagger 为什么要用swagger 问题起源于 前后端分离&#xff0c; 后端&#xff1a;后端控制层&#xff0c;服务层&#xff0c;数据访问层【后端团队】前端&#xff1a;前端控制层&#xff0c;视图层&#xff0c;【前端团队】 所以产生问题&#xff1a;前后端联调…

Keepalived+LVS构建高可用集群

目录 一、Keepalive基础介绍 1. Keepalive与VRRP 2. VRRP相关技术 3. 工作原理 4. 模块 5. 架构 6. 安装 7. Keepalived 相关文件 7.1 配置组成 7.2 全局配置 7.3 VRRP实例配置&#xff08;lvs调度器&#xff09; 7.4 虚拟服务器与真实服务器配置 二、Keepalived…

HTML静态网页成品作业(HTML+CSS)——花主题介绍网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

C语言:基于单链表实现的泊车管理系统

一、需求 &#xff08;1&#xff09;管理员方账号登录&#xff1b; &#xff08;2&#xff09;车位管理显示&#xff1a;车位状态&#xff1b; &#xff08;3&#xff09;收费管理&#xff1a;小轿车 5元/小时&#xff0c;面包车6元/小时&#xff0c;大货车或客车7元/小时&a…

node.js 下 mysql2 的 CURD 功能极简封装

此封装适合于使用 SQL 直接操作数据库的小型后端项目&#xff0c;更多功能请查阅MySQL2官网 // 代码保存到单独的 js 文件const mysql require(mysql2/promise)const debug true let conn/*** 执行 SQL 语句* param {String} sql* param {*} params* returns {Array}*/ const…

ChatGPT提示技巧——零,一和少量示例提示

ChatGPT提示技巧——零&#xff0c;一和少量示例提示 ​ 零样本(zero-shot)、少样本(few-shot)和单样本(one-shot)提示是用于在最少或没有示例的情况下从ChatGPT生成文本的技巧。这些技巧用于当某个具体任务有限定数据的时候或者任务是新的并且没有很好的定义的时候。 提示格…

JVM的各种垃圾回收器(GC)

1. Serial GC Serial GC 是用于单线程环境的垃圾回收器&#xff0c;它使用复制算法&#xff08;Copy&#xff09;进行年轻代的垃圾回收&#xff0c;而老年代则使用标记-整理&#xff08;Mark-Compact&#xff09;算法。由于它在进行垃圾回收时会暂停其他所有的工作线程&#xf…

严密的逻辑会不会影响创新

严密的逻辑可以对创新产生积极的影响&#xff0c;也可能对创新产生负面的影响。以下是两种可能的情况&#xff1a; 积极影响&#xff1a;严密的逻辑可以帮助创新者更好地理解问题&#xff0c;并找到解决问题的方法。它可以帮助人们分析和评估不同的创新想法&#xff0c;以确定哪…

设计模式之——简单工厂模式

上图为简单工厂模式的架构图。 1&#xff0c;产品&#xff08;Product&#xff09; 将会对接口进行声明。 2&#xff0c;具体产品&#xff08;Concrete Products&#xff09;是产品接口的不同实现。 3&#xff0c;创建者&#xff08;Concrete Creators&#xff09;将会重写基…

二刷代码随想录算法训练营第十五天 |层序遍历 10、 226.翻转二叉树 、101.对称二叉树 2

目录 一、102. 二叉树的层序遍历 二、226. 翻转二叉树 三、101. 对称二叉树 一、102. 二叉树的层序遍历 题目链接&#xff1a;力扣 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a; 讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode&#xff1a;102.二叉树的层序遍历…

TCP传输收发

TCP通信: TCP发端: socket connect send recv close TCP收端: socket bind listen accept send recv close 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t ad…

先缓存第二集抖音接入 ,最近加班猛,就分享简单的知识,如何使用:关于使用replace的用法正则表达式

1、需求&#xff1a;比如在cocos creator策划让你制作一个预制体&#xff0c;标题要读取配置&#xff0c;然后中间显示的内容要滚动的&#xff0c;要做成一个通用的&#xff0c;然后给到的配置表是这样子的: 配置表&#xff1a;假设字段是这样子的 content "内容标题&…

Intel 历代 CPU 型号

以下所有型号均为一整个系列&#xff0c;加上前缀、后缀啥的&#xff0c;差异化早在1970年代就被美国资本家玩明白了&#xff0c;充分地占领了市场。 CPU型号时间位数频率内存寻址地址总线说明400419714位740KHz640B4001(ROM)&#xff0c;4002(RAM)&#xff0c;4003(register)…

20个Python函数程序实例

前面介绍的函数太简单了&#xff1a; 以下是 20 个不同的 Python 函数实例 下面深入一点点&#xff1a; 以下是20个稍微深入一点的&#xff0c;使用Python语言定义并调用函数的示例程序&#xff1a; 20个函数实例 简单函数调用 def greet():print("Hello!")greet…

寻找最近的公共父视图

题目 求两个视图的最近公共父视图 暴力解法 采用的是两个 while 循环嵌套迭代来查询最近的公共父视图, 时间复杂度 O(n), 详见 Masonry 的实现&#xff1a; - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view {MAS_VIEW *closestCommonSuperview nil;MAS_VIEW *…