当前位置: 首页 > news >正文

VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间

一、GetProcessTimes函数简介(微软MSDN)

微软提供了一个非常有用的API函数GetProcessTimes用来获取进程创建时间、销毁时间、用户态时间、内核态时间,msdn连接为:GetProcessTimes 函数 (processthreadsapi.h)
其函数原型为:

BOOL GetProcessTimes([in]  HANDLE     hProcess,[out] LPFILETIME lpCreationTime,[out] LPFILETIME lpExitTime,[out] LPFILETIME lpKernelTime,[out] LPFILETIME lpUserTime
);

其参数如下:
参数
其返回值和函数说明如下:
返回值和库依赖

二、示例程序

相关示例程序如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Psapi.h>
#include <winnt.h>
#include <winternl.h>
#include <chrono>
#include <iostream>using namespace std;
using namespace std::chrono;void test_GetProcessTimes()
{HANDLE     processHandle = GetCurrentProcess();DWORD      currentProcessId = GetProcessId(processHandle);FILETIME createTime, exitTime, kernelTime, userTime;// 获取当前进程的PIDDWORD pid = GetCurrentProcessId();printf("pid: %d\t currentProcessId: %d\n", pid, currentProcessId);GetProcessTimes(processHandle, &createTime, &exitTime, &kernelTime, &userTime);printf("processHandle: %lu\t currentProcessId: %d\n", HandleToULong(processHandle), currentProcessId);printf("Create time: %lu\t       %lu\nExit Time: %lu\t     %lu\nKernel time: %lu\t       %lu\nUser time: %lu\t    %lu\n",createTime.dwLowDateTime, createTime.dwHighDateTime,exitTime.dwLowDateTime, exitTime.dwHighDateTime,kernelTime.dwLowDateTime, kernelTime.dwHighDateTime,userTime.dwLowDateTime, userTime.dwHighDateTime);::CloseHandle(processHandle);
}// 返回进程pid创建时间到现在时间经过的秒数
double get_uptime_sec(DWORD pid)
{double r{ 0 };HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);if (hProcess){FILETIME creationTime, exitTime, kernelTime, userTime;if (::GetProcessTimes(hProcess, &creationTime, &exitTime, &kernelTime, &userTime)) {LARGE_INTEGER tCreate;tCreate.LowPart = creationTime.dwLowDateTime;tCreate.HighPart = creationTime.dwHighDateTime;std::cout << "tCreate: " << tCreate.QuadPart << std::endl;int64_t tt = (static_cast<int64_t>(creationTime.dwHighDateTime) << 32) | creationTime.dwLowDateTime;std::cout << "tt: " << tt << std::endl;SYSTEMTIME stCreate;FileTimeToSystemTime(&creationTime, &stCreate);r = (double)stCreate.wHour * 3600.0 +(double)stCreate.wMinute * 60.0 +(double)stCreate.wSecond +(double)stCreate.wMilliseconds / 1000.0;std::cout << "r: " << r << std::endl;}::CloseHandle(hProcess);}return r;
}

三、进一步扩展:获取每个进程一段时间内的CPU使用率

由于GetProcessTimes 函数可以获取某个进程的在内核模式下执行的时间量和用户模式下执行的时间量(以100纳秒为单位)。我们可以先使用NtQuerySystemInformation函数获取每个CPU核心的总的用户态、内核态、空闲时间总时间量sysTotalTime,然后遍历枚举当前系统所有运行进程,再用GetProcessTimes去获取每个进程的在内核模式下执行的时间量和用户模式下执行的时间量,除以sysTotalTime即为该进程的CPU使用率。开一个线程每隔一段时间,比如说250毫秒、500毫秒、1秒、2秒等定时轮询获取。
参考ProcessHacker的源代码,它里面也大体是这个思路。

四、参考资料

  • getProcessTimes 函数 (processthreadsapi.h)

  • How to retrieve the running-time of a process

  • How to get Process Uptime in Windows

相关文章:

  • 20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG
  • Global IIIumination(GI)全局光照原理(一)3D空间全局光照
  • 【计算机网络实验】实验三 IP网络规划与路由设计(头歌)
  • 三. LiDAR和Camera融合的BEV感知算法-BEVFusion实战
  • 聚类算法的性能度量
  • MFC CLXHHandleEngine动态库-自定义设置对话框使用
  • 【线性代数与矩阵论】Jordan型矩阵
  • http的 content-type都有哪些?
  • Centos7及Ubuntu系统安装指定版本dockerdocker-compose安装
  • 基于以太坊的智能合约开发Solidity(基础篇)
  • Leetcode—389.找不同【简单】
  • 什么是神经网络的非线性
  • Unity 资源管理之Resources
  • TCP单聊和UDP群聊
  • 安卓11修改power按键功能
  • 【Leetcode】101. 对称二叉树
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Angular数据绑定机制
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue的全局变量和全局拦截请求器
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从0到1:PostCSS 插件开发最佳实践
  • 构建二叉树进行数值数组的去重及优化
  • 回流、重绘及其优化
  • 记一次删除Git记录中的大文件的过程
  • 批量截取pdf文件
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深度学习在携程攻略社区的应用
  • 说说动画卡顿的解决方案
  • 我从编程教室毕业
  • 正则学习笔记
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • $$$$GB2312-80区位编码表$$$$
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (十六)视图变换 正交投影 透视投影
  • (四)图像的%2线性拉伸
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bashrc在哪里,alias妙用
  • .gitignore文件---让git自动忽略指定文件
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 设计一套高性能的弱事件机制
  • .Net8 Blazor 尝鲜
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @GetMapping和@RequestMapping的区别
  • @RequestBody与@ResponseBody的使用