| 61 | }; |
| 62 | |
| 63 | void GetCpuInfo(CpuInfo &cpu_info) { |
| 64 | CpuInfo new_cpu_info; |
| 65 | |
| 66 | char *line{nullptr}; |
| 67 | size_t len{0}; |
| 68 | ssize_t read; |
| 69 | |
| 70 | bool is_read_cpu_info{false}; |
| 71 | |
| 72 | FILE *proc_fp = fopen("/proc/stat", "r"); |
| 73 | if(NULL == proc_fp) { |
| 74 | cpu_info = CpuInfo(); |
| 75 | return; |
| 76 | } |
| 77 | |
| 78 | while ((read = getline(&line, &len, proc_fp)) != -1) { |
| 79 | if (strncmp(line, "cpu", 3) == 0) { |
| 80 | char *p = line; |
| 81 | |
| 82 | while (isspace(*p)) |
| 83 | p++; |
| 84 | while (*p && !isspace(*p)) |
| 85 | p++; |
| 86 | |
| 87 | new_cpu_info.use = strtoull(p, &p, 10); |
| 88 | new_cpu_info.nice = strtoull(p, &p, 10); |
| 89 | new_cpu_info.sys = strtoull(p, &p, 10); |
| 90 | new_cpu_info.idle = strtoull(p, &p, 10); |
| 91 | new_cpu_info.iowait = strtoull(p, &p, 10); |
| 92 | new_cpu_info.hardirq = strtoull(p, &p, 10); |
| 93 | new_cpu_info.softirq = strtoull(p, &p, 10); |
| 94 | |
| 95 | double all_new = (double) (new_cpu_info.use + new_cpu_info.nice + new_cpu_info.sys |
| 96 | + new_cpu_info.idle + new_cpu_info.hardirq + new_cpu_info.softirq |
| 97 | + new_cpu_info.iowait); |
| 98 | double all_old = (double) (cpu_info.use + cpu_info.nice |
| 99 | + cpu_info.sys + cpu_info.idle + cpu_info.hardirq |
| 100 | + cpu_info.softirq + cpu_info.iowait); |
| 101 | |
| 102 | double all = all_new - all_old; |
| 103 | if (all <= 0.0001) { |
| 104 | is_read_cpu_info = true; |
| 105 | break; |
| 106 | } |
| 107 | |
| 108 | double rate{0}; |
| 109 | |
| 110 | rate = 100.0 * (new_cpu_info.use - cpu_info.use) / all; |
| 111 | if (rate > 0) { |
| 112 | new_cpu_info.userate = (unsigned long long) round(rate); |
| 113 | } |
| 114 | |
| 115 | rate = 100.0 * (new_cpu_info.sys - cpu_info.sys) / all; |
| 116 | if (rate > 0) { |
| 117 | new_cpu_info.sysrate = (unsigned long long) round(rate); |
| 118 | } |
| 119 | |
| 120 | rate = 100.0 * (new_cpu_info.iowait - cpu_info.iowait) / all; |