获取硬盘和网卡流量

#include <sys/vfs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <string>
#include <assert.h>

using std::string;

string DiskCapacity(const string &path)
{
    assert(path.size() > 0);
    char disk_capacity[128];
    struct statfs st;
    int ret = statfs(path.c_str(), &st);
    if (ret == 0) {
		float freeCap = (1.0 * st.f_bsize * st.f_bavail) / (1024*1024*1024);
		float totalCap = (1.0 * st.f_bsize * st.f_blocks) / (1024*1024*1024);
		snprintf(disk_capacity, 128, "%.2f", freeCap);

    } else  {
        return "0";
    }

	return string(disk_capacity);
}

int64_t NetworkLoad()
{
	int64_t recv_bytes = 0;
	int64_t ethX_count = 0;
	size_t len = 0;
	ssize_t read;

	FILE* fp;
	fp = fopen("/proc/net/dev", "r");
	if (fp == NULL) {
	   printf("open /proc/net/dev fail errmsg=%s", strerror(errno));
           return 0;
	}

	char * line = NULL;
	while ((read = getline(&line, &len, fp)) != -1) {
		string line_str = line;
		string::size_type eth_pos;
		if ( (eth_pos = line_str.find("eth") ) != string::npos ) {
			string::size_type space_pos_t =  line_str.find(' ', eth_pos + 5);
			if (space_pos_t != string::npos) {
				recv_bytes += atol(line_str.substr(eth_pos + 5, space_pos_t - eth_pos - 5).c_str());
			}
			ethX_count++;
		}
	}
	if (line) 
		free(line);

	fclose(fp);

	return recv_bytes / ethX_count ; 
}

int main(int argc,char* argv[])
{
	printf("%s,%d", DiskCapacity("/").c_str(), NetworkLoad()/1024 );

}

 

你可能感兴趣的:(获取)