-
Notifications
You must be signed in to change notification settings - Fork 0
/
procreader.c
56 lines (50 loc) · 1.84 KB
/
procreader.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "procstat.h"
#include "procreader.h"
#include "doublebuf.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <inttypes.h>
#include "logger.h"
//Read cpu data from kernel
int readProc(FILE* fil, struct system_stats* result){
if (fil == NULL){
return 1;
}
fseek(fil, 0, SEEK_SET);
result->num_cores = 0;
char* linebuf = NULL;
size_t linelen = 0;
while(getline(&linebuf, &linelen, fil) != -1){
if (strlen(linebuf) > 4 && memcmp(linebuf, "cpu", 3) == 0 && linebuf[3] != ' '){
result->cores = realloc(result->cores, sizeof(struct core_stats)*(result->num_cores+1u));
struct core_stats* target = &(result->cores[result->num_cores]);
sscanf(linebuf+3, "%d %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64,
&(target->core_id), &(target->user), &(target->nice), &(target->system), &(target->idle),
&(target->iowait), &(target->irq), &(target->softirq), &(target->steal), &(target->guest), &(target->guest_nice));
result->num_cores++;
}
}
free(linebuf);
return 0;
}
static FILE* myFile;
static struct doublebuffer* sendpipe;
void initReader(char path[], struct doublebuffer* send){
myFile = fopen(path, "r");
sendpipe = send;
}
void destroyReader(void){
fclose(myFile);
}
void processReader(void){
struct system_stats cpudata;
cpudata.cores = NULL;
cpudata.num_cores = 0;
readProc(myFile, &cpudata);
writeBuf(sendpipe, cpudata.cores, sizeof(struct core_stats)*cpudata.num_cores);
dlog("sending kernel data\n");
free(cpudata.cores);
//sleep(1);
}