Windows下用C语言获取系统的CPU利用率、内存使用率、硬盘使用率等

最近在做一个网管软件用C语言获取的系统的一些参数,其中包括系统时间,系统运行时间,系统版本,CPU利用率,内存使用率,硬盘使用率,CPU风扇转速等参数,整理代码如下:

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

#define DIV 1024
#define WIDTH 7
#define GB(x) (((x).HighPart << 2) + ((DWORD)(x).LowPart) / 1024.0 / 1024.0 / 1024.0)

#pragma warning(disable: 4996)   

#define true 1
typedef	unsigned char U_CHAR;

//获取系统时间
int getSystemTime(char* buffer){

	char buf[128];
	time_t rawtime;
	struct tm * timeinfo;
	time(&rawtime);
	timeinfo = localtime(&rawtime);
	strftime(buf, sizeof(buf), "Now is %Y-%m-%d %H:%M:%S", timeinfo);
	strcpy(buffer,buf);
}

//CPU利用率
FILETIME m_preidleTime;
FILETIME m_prekernelTime;
FILETIME m_preuserTime;

__int64 CompareFileTime2(FILETIME time1, FILETIME time2)
{
	__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
	__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;


	return   b - a;
}

void GetCpuUseage()
{
	GetSystemTimes(&m_preidleTime, &m_prekernelTime, &m_preuserTime);
	Sleep(1000);
}

double CpuUseage()
{
	FILETIME idleTime;
	FILETIME kernelTime;
	FILETIME userTime;
	GetSystemTimes(&idleTime, &kernelTime, &userTime);


	int idle = CompareFileTime2(m_preidleTime, idleTime);
	int kernel = CompareFileTime2(m_prekernelTime, kernelTime);
	int user = CompareFileTime2(m_preuserTime, userTime);


	if (kernel + user == 0)
		return 0.0;
	//(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率
	double cpu = abs((kernel + user - idle) * 100 / (kernel + user));

	m_preidleTime = idleTime;
	m_prekernelTime = kernelTime;
	m_preuserTime = userTime;
	return cpu;
}

//读取操作系统的名称
void GetSystemName(char* osname)
{
	char buf[128];
	SYSTEM_INFO info;        //用SYSTEM_INFO结构判断64位AMD处理器 
	GetSystemInfo(&info);    //调用GetSystemInfo函数填充结构 
	OSVERSIONINFOEX os;
	os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

	strcpy(buf, "unknown OperatingSystem.");

	if (GetVersionEx((OSVERSIONINFO *)&os))
	{
		//下面根据版本信息判断操作系统名称 
		switch (os.dwMajorVersion)//判断主版本号
		{
		case 4:
			switch (os.dwMinorVersion)//判断次版本号 
			{
			case 0:
				if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
					strcpy(buf, "Microsoft Windows NT 4.0"); //1996年7月发布 
				else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
					strcpy(buf, "Microsoft Windows 95");
				break;
			case 10:
				strcpy(buf, "Microsoft Windows 98"); 
				break;
			case 90:
				strcpy(buf, "Microsoft Windows Me"); 
				break;
			}
			break;

		case 5:
			switch (os.dwMinorVersion)	//再比较dwMinorVersion的值
			{
			case 0:
				strcpy(buf, "Microsoft Windows 2000"); //1999年12月发布
				break;

			case 1:
				strcpy(buf, "Microsoft Windows XP"); //2001年8月发布
				break;

			case 2:
				if (os.wProductType == VER_NT_WORKSTATION
					&& info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
				{
					strcpy(buf, "Microsoft Windows XP Professional x64 Edition"); 
				}
				else if (GetSystemMetrics(SM_SERVERR2) == 0)
					strcpy(buf, "Microsoft Windows Server 2003"); //2003年3月发布 
				else if (GetSystemMetrics(SM_SERVERR2) != 0)
					strcpy(buf, "Microsoft Windows Server 2003 R2"); 
				break;
			}
			break;

		case 6:
			switch (os.dwMinorVersion)
			{
			case 0:
				if (os.wProductType == VER_NT_WORKSTATION)
					strcpy(buf, "Microsoft Windows Vista"); 
				else
					strcpy(buf, "Microsoft Windows Server 2008"); //服务器版本 
				break;
			case 1:
				if (os.wProductType == VER_NT_WORKSTATION)
					strcpy(buf, "Microsoft Windows 7"); 
				else
					strcpy(buf, "Microsoft Windows Server 2008 R2"); 
				break;
			}
			break;
		}
	}//if(GetVersionEx((OSVERSIONINFO *)&os))

	strcpy(osname, buf);
}

int main(){

	//获取系统时间
	char buffer[128];
	getSystemTime(buffer);
	puts(buffer);

	//系统运行时间
	clock_t start, finish;
	double duration;

	start = clock();
	while (true)
	{
		finish = clock();
		duration = (double)(finish - start) / CLOCKS_PER_SEC;
		Sleep(1000);
		printf("%.0f 秒\n", duration);

	}

	//系统版本名称
	char osname[20];
	GetSystemName(osname);
	printf("%s\n", osname);

	//CPU利用率
	while (true)
	{
		U_CHAR  sysStateCpu[5];
		double cpu = CpuUseage();
		sprintf((char*)sysStateCpu, "%.2lf", cpu);
		printf("CPU使用率:%s%%\n", sysStateCpu);
		Sleep(1000);
	}

	//内存使用率
	char bufPreCPU[5];
	MEMORYSTATUSEX statex;
	statex.dwLength = sizeof(statex);
	GlobalMemoryStatusEx(&statex);
	sprintf(bufPreCPU, "%ld%%\n", statex.dwMemoryLoad);
	puts(bufPreCPU);

	//硬盘使用率 调用windows API
	ULARGE_INTEGER FreeBytesAvailableC, TotalNumberOfBytesC, TotalNumberOfFreeBytesC;
	ULARGE_INTEGER FreeBytesAvailableD, TotalNumberOfBytesD, TotalNumberOfFreeBytesD;
	ULARGE_INTEGER FreeBytesAvailableE, TotalNumberOfBytesE, TotalNumberOfFreeBytesE;
	ULARGE_INTEGER FreeBytesAvailableF, TotalNumberOfBytesF, TotalNumberOfFreeBytesF;
		 
	GetDiskFreeSpaceEx(_T("C:"), &FreeBytesAvailableC, &TotalNumberOfBytesC, &TotalNumberOfFreeBytesC);
	GetDiskFreeSpaceEx(_T("D:"), &FreeBytesAvailableD, &TotalNumberOfBytesD, &TotalNumberOfFreeBytesD);
	GetDiskFreeSpaceEx(_T("E:"), &FreeBytesAvailableE, &TotalNumberOfBytesE, &TotalNumberOfFreeBytesE);
	GetDiskFreeSpaceEx(_T("F:"), &FreeBytesAvailableF, &TotalNumberOfBytesF, &TotalNumberOfFreeBytesF);
	/*参数 类型及说明
	lpRootPathName String,不包括卷名的磁盘根路径名
	lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
	lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数
	lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数
	适用平台
	Windows 95 OSR2,Windows NT 4.0*/
	float totalHardDisk = GB(TotalNumberOfBytesC) + GB(TotalNumberOfBytesD) + GB(TotalNumberOfBytesE) + GB(TotalNumberOfBytesF);
	float freeHardDisk = GB(TotalNumberOfFreeBytesC) + GB(TotalNumberOfFreeBytesD) + GB(TotalNumberOfFreeBytesE) + GB(TotalNumberOfFreeBytesF);
	
	float hardDiskUsage = 1- freeHardDisk / totalHardDisk;

	//CPU风扇转速

	printf("hello world!\n");
	system("pause");

}







  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
Linux 系统中计算进程 CPU 利用率的公式如下: CPU 利用率 = 100 * (进程使用的 CPU 时间 / 系统CPU 时间) 其中,进程使用的 CPU 时间指的是进程在 CPU 上运行的时间,包括用户态和内核态的时间。系统CPU 时间指的是系统中所有 CPU 的累计时间。 以下是用 C 语言实现该公式的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BUF_SIZE 1024 int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s <pid>\n", argv[0]); exit(EXIT_FAILURE); } char stat_file[BUF_SIZE]; snprintf(stat_file, BUF_SIZE, "/proc/%s/stat", argv[1]); FILE* fp = fopen(stat_file, "r"); if (!fp) { perror("fopen"); exit(EXIT_FAILURE); } unsigned long utime, stime, cutime, cstime; fscanf(fp, "%*d %*s %*c %*d %*d %*d %*d %*d %*u " "%*u %*u %*u %*u %lu %lu %lu %lu", &utime, &stime, &cutime, &cstime); fclose(fp); unsigned long long total_time = utime + stime + cutime + cstime; unsigned long long system_uptime = 0; fp = fopen("/proc/uptime", "r"); if (fp) { fscanf(fp, "%llu", &system_uptime); fclose(fp); } unsigned long long cpu_time = sysconf(_SC_CLK_TCK) * system_uptime; double cpu_usage = 100.0 * total_time / cpu_time; printf("CPU usage: %.2f%%\n", cpu_usage); return 0; } ``` 该程序的输入参数为进程 PID,它会读取 `/proc/PID/stat` 文件中的 CPU 时间信息,并根据系统启动时间计算出系统CPU 时间,最终输出进程的 CPU 利用率

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DaveBobo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值