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

这篇具有很好参考价值的文章主要介绍了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
);

其参数如下:
VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间,c++,开发语言
其返回值和函数说明如下:
VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间,c++,开发语言

二、示例程序

相关示例程序如下所示:

#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;
	// 获取当前进程的PID
	DWORD 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文章来源地址https://www.toymoban.com/news/detail-759005.html

到了这里,关于VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SOAP学习之一:Visual C++创建简单的客户端--使用soap toolkit 3.0获取UTC服务器时间

    初始接触 XML及SOAP第一天,摸不着头绪,看了很多文章,总结一下几点心得,附一个小例子使用VC++控制台程序获取UTC服务器时间。 看到的资料VC++都是使用soap toolkit来使用SOAP,soap toolkit目前看最高版本应该是3.0,但是微软已经不再对soap toolkit提供技术支持及更新,在微软官网

    2024年02月09日
    浏览(54)
  • Effective第三版 中英 | 第2章 创建和销毁对象 | 当面临多个参数的构造器时考虑使用构建器

    大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔记,代码分享出来,供大家学习交流,如若笔记中有不对的地方,那一定是当时我的理解还不够,希望你能及时提出。如果对于该笔记存在很多疑惑,

    2024年02月07日
    浏览(34)
  • C语言实现获取文件大小、创建时间、修改时间(stat结构体)

    源代码: 编译输出: 结构体原型:

    2024年02月06日
    浏览(40)
  • 函数栈帧的创建和销毁

    前言 观察函数栈帧的创建和销毁,不要使用太高级别的的编译器,越高级的编译器越不容易学习和观察。同时在不同编译器下,函数调用的过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现 我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以

    2023年04月17日
    浏览(35)
  • 函数栈帧的创建与销毁

    魔王的介绍:😶‍🌫️一名双非本科大一小白。 魔王的目标:🤯努力赶上周围卷王的脚步。 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍🔥大魔王与你分享:莫泊桑说过,生活可能不像你想象的那么好,但是也不会像你想象的那么糟。人的脆弱和坚强都超乎了自己的想

    2024年02月15日
    浏览(30)
  • c语言(函数栈帧的创建和销毁)

    前沿:         可能很多人也是第一次听说函数栈帧这个词,想问什么是函数栈帧,理解函数栈帧有什么作用,函数栈帧的创建销毁是什么呢?这章节我们就来了解一下c语言中函数栈帧的创建和销毁。 思维导图: 目录   一、什么是函数栈帧  1.1   函数栈帧: 1.2  栈:  

    2024年02月07日
    浏览(30)
  • 【C语言】函数栈帧的创建与销毁

    今天我们要学习的是函数栈帧的创建与销毁,学完这部分内容,我们可以解决下面的几个问题: 局部变量是怎么创建的? 为什么局部变量的值是随机值? 函数是怎么传参的?传参顺序是怎样的? 形参和实参是什么关系? 函数调用是怎么做的? 函数调用是怎么做的? 函数调

    2024年02月09日
    浏览(28)
  • 【C语言】函数栈帧的创建和销毁

    👦个人主页:Weraphael ✍🏻作者简介:目前正在回炉重造C语言(2023暑假) ✈️专栏:【C语言航路】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍 在学习C语言的时候,我们可能有很多困惑。比如: 局部变量

    2024年02月13日
    浏览(29)
  • VC++创建windows服务程序

    目录 1.关于windows标准可执行程序和服务程序 2.服务相关整理 2.1 VC++编写服务 2.2 服务注册 2.3  服务卸载 2.4 启动服务 2.5 关闭服务 2.6 sc命令 2.7 查看服务 3.标准程序 3.1 后台方式运行标准程序 3.2 查找进程 3.3 终止进程        以前经常在Linux下编写服务器程序,服务器程序大多

    2024年02月07日
    浏览(28)
  • C语言——详解函数栈帧的创建和销毁

    为了深入学习C语言,也为了方便理解,我学习了函数栈帧。函数栈帧的创建和销毁能够让我更加深刻的了解编程逻辑和语法。我们学习语法和编程逻辑都是基于封装好的知识上得。因此,我们有必要对函数栈帧的创建和销毁进行学习。本篇博客将用来介绍函数栈帧的创建和销

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包