linux 下获取CPU,内存,磁盘状态

#include <unistd.h>
#include <stdlib.h>

#include <stdio.h>
#include <sys/sysinfo.h>
#include <mntent.h>
#include <string.h>
#include <errno.h>
#include <sys/vfs.h>
#include <dirent.h>
typedef struct
{
char* name;
unsigned long user;
unsigned long nic;
unsigned long system;
unsigned long idle;
}SysCPUInfo;

typedef struct
{
unsigned long MemFree;
unsigned long MemTotal;
}SysMemInfo;

typedef struct
{
char type[40];

char device[40];
char mntpnt[40];

unsigned long blocks;

unsigned long bfree;

unsigned long availiable_disk;	

unsigned long bused;
float bused_percent;
}DiskInfo;

typedef struct
{
unsigned long Disk_Total;

unsigned long Disk_Free;
}SysDiskInfo;


SysCPUInfo* _GetHostCPUInfo()

{

	SysCPUInfo *cpuinfo = (SysCPUInfo *)malloc(sizeof(SysCPUInfo));

	

	FILE 	*fd;

	char	buff[256];

	memset(buff, '\0', 256);



	fd = fopen("/proc/stat", "r");

	fgets(buff, sizeof(buff), fd);
	char name[20];

	unsigned long user;
	unsigned long nic;
	unsigned long system;
	unsigned long idle;

	sscanf(buff, "%s %lu %lu %lu %lu", name, &user, &nic, 

				&system, &idle);
        cpuinfo->name = name;
	cpuinfo->user = user;
	cpuinfo->nic = nic;
	cpuinfo->system = system;
	cpuinfo->idle = idle;
	printf("%s %lu %lu %lu %lu\n",cpuinfo->name,cpuinfo->user,cpuinfo->nic,cpuinfo->system,cpuinfo->idle);

	fclose(fd);

	return cpuinfo;

}



float _CalculateHostCPURate(SysCPUInfo *first, SysCPUInfo *second)

{

	unsigned long	old_CPU_Time, new_CPU_Time;

	unsigned long	usr_Time_Diff, sys_Time_Diff, nic_Time_Diff;

	float 			cpu_use = 0.0;



	old_CPU_Time = (unsigned long)(first->user + first->nic + first->system + first->idle);

	new_CPU_Time = (unsigned long)(second->user + second->nic + second->system + second->idle);



	usr_Time_Diff = (unsigned long)(second->user - first->user);

	sys_Time_Diff = (unsigned long)(second->system - first->system);

	nic_Time_Diff = (unsigned long)(second->nic -first->nic);

	printf("old_CPU_Time = %lu, new_CPU_Time = %lu\n",old_CPU_Time,new_CPU_Time);

	if ((new_CPU_Time - old_CPU_Time) != 0)

	  cpu_use = (float)100*(usr_Time_Diff + sys_Time_Diff + nic_Time_Diff)/(new_CPU_Time - old_CPU_Time);

	else

	  cpu_use = 0.0;

	return cpu_use;

}



float GetHostCPURate()

{

	float cpu_rate;

	SysCPUInfo *first, *second;

	first = _GetHostCPUInfo();

	sleep(1);

	second = _GetHostCPUInfo();



	cpu_rate = _CalculateHostCPURate(first, second);



	/* clean auxiliary memory */

	free(first);

	free(second);
	first = second = NULL;
	return cpu_rate;

}



SysMemInfo* GetHostMemInfo()

{

	SysMemInfo *memInfo = (SysMemInfo *)malloc(sizeof(SysMemInfo));

	struct sysinfo tmp;

	int ret = 0;

	ret = sysinfo(&tmp);

	if (ret == 0) {

		memInfo->MemFree = (unsigned long)tmp.freeram/(1024*1024);

		memInfo->MemTotal = (unsigned long)tmp.totalram/(1024*1024);

	} 

	return memInfo;

}



SysDiskInfo* GetHostDiskInfo(char* diskName)

{
       printf("%s \n",diskName);

	SysDiskInfo *sys_disk_info = (SysDiskInfo *)malloc(sizeof(SysDiskInfo));

	DiskInfo		*disk_info;

	struct statfs	fs_info;

	struct mntent	*mnt_info;

	FILE			*fh;

	float			percent;

	unsigned long	sum_Total = 0, total_free = 0;



	if ((fh = setmntent("/etc/mtab", "r")) == NULL) {

		printf("Cannot open /etc/mtab file!:%s\n",strerror(errno));

		return NULL;

	}



	while ((mnt_info = getmntent(fh)) != NULL) {

		if (statfs(mnt_info->mnt_dir, &fs_info) < 0) {

			continue;

		}

		

		if ((disk_info = (DiskInfo *)malloc(sizeof(DiskInfo))) == NULL) {

			continue;

		}

		/*if (strcmp(mnt_info->mnt_type, "proc") &&

			strcmp(mnt_info->mnt_type, "devfs") &&

			strcmp(mnt_info->mnt_type, "usbfs") &&

			strcmp(mnt_info->mnt_type, "sysfs") &&

			strcmp(mnt_info->mnt_type, "tmpfs") &&

			strcmp(mnt_info->mnt_type, "devpts") &&

			strcmp(mnt_info->mnt_type, "fusectl") &&

			strcmp(mnt_info->mnt_type, "debugfs") &&

			strcmp(mnt_info->mnt_type, "binfmt_misc") &&

			strcmp(mnt_info->mnt_type, "fuse.gvfs_fuse_daemon")&&

			strcmp(mnt_info->mnt_type, "securityfs"))*/
		if(strcmp(mnt_info->mnt_fsname, diskName) == 0)
		       {

			if (fs_info.f_blocks != 0) {

				percent = (((float)fs_info.f_blocks - (float)fs_info.f_bfree)* 100.0/

							(float)fs_info.f_blocks);
			printf("%f\n",percent);

			} else {

				percent = 0;

			}

		} else {

			continue;

		}

		

		strcpy(disk_info->type, mnt_info->mnt_type);

		strcpy(disk_info->device, mnt_info->mnt_fsname);

		strcpy(disk_info->mntpnt, mnt_info->mnt_dir);



		unsigned long block_size = fs_info.f_bsize/1024;

		disk_info->blocks = fs_info.f_blocks * block_size / 1024;

		disk_info->bfree = fs_info.f_bfree * block_size / 1024;

		disk_info->availiable_disk = fs_info.f_bavail * block_size / 1024;

		disk_info->bused = (fs_info.f_blocks - fs_info.f_bfree) * block_size / 1024;

		disk_info->bused_percent = percent;

		

		sum_Total += disk_info->blocks;

		total_free += disk_info->availiable_disk;



		/* clean auxiliary memory */

		free(disk_info);

		disk_info = NULL;

	}

	sys_disk_info->Disk_Total = sum_Total/1024;

	sys_disk_info->Disk_Free = total_free/1024;

	return sys_disk_info;

}



int main()

{

	float cpuRate = GetHostCPURate();
	SysMemInfo* memInfo = GetHostMemInfo();

	SysDiskInfo* diskInfo = GetHostDiskInfo("/dev/sda1");
	printf("cpuRate = %f,meminfo_total = %lu, meminfo_free = %lu, diskinfo_total = %lu,diskinfo_free = %lu",cpuRate,memInfo->MemFree,memInfo->MemTotal,diskInfo->Disk_Total,diskInfo->Disk_Free);

}
已在Ubuntu编译运行。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值