From 6ff6a5813297599e9415cdd2245c99534aa86bdf Mon Sep 17 00:00:00 2001 From: Iain Date: Tue, 20 Jul 2021 21:07:55 +0800 Subject: [PATCH] merge light's code by hand --- src/MonitorProcess.c | 117 +++++++++++++++++++++++++++++-------------- src/MonitorProcess.h | 21 ++++---- src/MonitorSys.c | 20 +++++++- src/MonitorSys.h | 10 ++++ 4 files changed, 120 insertions(+), 48 deletions(-) diff --git a/src/MonitorProcess.c b/src/MonitorProcess.c index 11e4619..cc35de3 100644 --- a/src/MonitorProcess.c +++ b/src/MonitorProcess.c @@ -5,16 +5,33 @@ #include "MonitorProcess.h" #include #include +#include +#include #include +#define BUFFER_SIZE_PROC_STAT 1024 #define STAT_UTIME 13 #define STAT_STIME 14 #define STAT_VSZ 22 #define STAT_RSS 23 -extern int Proc_List_Free_ID; -extern int Proc_List_ID; -extern Proc_Info Proc_List[PROCESS_NUMBER]; +extern int Proc_List_CURRENT; +extern Proc_Info Proc_List[MONITOR_PROCESS_NUMBER]; + +void cleanProc_Info(Proc_Info *proc) { + int i; + proc->pid = 0; + proc->point = 0; + strcpy(proc->name, ""); + for (i = 0; i < UPDATE_FREQUENCY; i++) { + proc->cpuInfo[i].utime = 0; + proc->cpuInfo[i].stime = 0; + proc->memInfo[i].vsz = 0; + proc->memInfo[i].vsz = 0; + } + + return; +} //update process cpu time and mem info by /proc/PID/stat //example: 1 (systemd) S 0 1 1 0 -1 4194560 16465 675919 50 519 44 100 678 258 20 0 1 0 13 44421120 1253 18446744073709551615 94869015482368 94869016924823 140724538057904 0 0 0 671173123 4096 1260 1 0 0 17 0 0 0 14 0 0 94869019025816 94869019170360 94869036843008 140724538064796 140724538064863 140724538064863 140724538064863 0 @@ -68,56 +85,80 @@ extern Proc_Info Proc_List[PROCESS_NUMBER]; */ int updateProcInfo(Proc_Info *proc) { char file_path[64] = {0}; - char buffer[512] = {0}; - sprintf(file_path, "/proc/%ls/stat", &proc->pid); - + char buffer[BUFFER_SIZE_PROC_STAT] = {0}; + sprintf(file_path, "./proc/%d/stat", proc->pid); FILE *fd = NULL; fd = fopen(file_path, "r"); if (fd == NULL) { return -1; } + unsigned long utime, stime, vsz, rss; + fgets(buffer, BUFFER_SIZE_PROC_STAT, fd); + // 14 utime 15 stime 23 24 vsz rss + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + sscanf(buffer, "%*s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %u %u %*s %*s %*s %*s %*s %*s %*s %*s %u %u ", + proc->name, &utime, &stime, &vsz, &rss); + printf("%d %s %d %d %d %d\n", proc->pid, proc->name, utime, stime, vsz, rss); + proc->point++; + proc->point %= UPDATE_FREQUENCY; - const char *p = buffer; - - int len = strlen(buffer); - int i; - int count = 0; - for (i = 0; i < len; i++) { - if (' ' == *p) { - count++; - if (count < STAT_UTIME) { - continue; - } - if (count == STAT_STIME) { - int pass; - } - if (count == STAT_UTIME) { - int pass; - } - if (count == STAT_VSZ) { - int pass; - } - if (count == STAT_RSS) { //counted by page(4K) - proc->memInfo->rss *= 4; - int pass; - } - } - p++; - } + proc->cpuInfo[proc->point].utime = utime; + proc->cpuInfo[proc->point].stime = stime; + proc->memInfo[proc->point].vsz = vsz; + proc->memInfo[proc->point].rss = rss * 4; fclose(fd); return 0; } +int foundProcess(Proc_Info *pList, unsigned int id) { + int i; + for (i = 0; i < MONITOR_PROCESS_NUMBER; i++) { + if ((pList + i)->pid == id) { + return i; + } + } + return -1; +} + +unsigned int *getProcess() { + static unsigned int ids[MONITOR_PROCESS_NUMBER] = {0}; + DIR *dirp; + struct dirent *direntp; + unsigned int id = 0; + if ((dirp = opendir("./proc/")) == NULL) { + exit(1); + } + int index = 0; + int i; + unsigned int temp; + while ((direntp = readdir(dirp)) != NULL) { + id = atoi(direntp->d_name); + if (id > 0) { + for (i = 0; i < index; i++) { + if (ids[i] > id) { + temp = id; + id = ids[i]; + ids[i] = temp; + } + } + ids[index] = id; + index++; + } + } + closedir(dirp); + return &ids[0]; +} + void updateProcList() { Proc_Info *proc; char file_path[64] = {0}; while (1) { - if (Proc_List_ID == PROCESS_NUMBER) { - Proc_List_ID = 0; - usleep(1000); + if (Proc_List_CURRENT == MONITOR_PROCESS_NUMBER) { + Proc_List_CURRENT = 0; + usleep(60000 / UPDATE_FREQUENCY); } - *proc = Proc_List[Proc_List_ID]; + *proc = Proc_List[Proc_List_CURRENT]; //check PID if (&proc->pid != 0) { if (updateProcInfo(proc) == -1) { @@ -128,7 +169,7 @@ void updateProcList() { } }; } - Proc_List_ID++; + Proc_List_CURRENT++; } return; } \ No newline at end of file diff --git a/src/MonitorProcess.h b/src/MonitorProcess.h index df33033..139fcd8 100644 --- a/src/MonitorProcess.h +++ b/src/MonitorProcess.h @@ -5,15 +5,16 @@ #ifndef ATOP_MONITORPROCESS_H #define ATOP_MONITORPROCESS_H -#define PROCESS_NUMBER 64 //max monitor 64 process +#define UPDATE_FREQUENCY 60 //update times per minute +#define MONITOR_PROCESS_NUMBER 64 //max monitor 64 process //proc/PID/stat -typedef struct { +typedef struct Proc_CPU_Time_ { unsigned long utime; //user time unsigned long stime; //kernel time } Proc_CPU_Time; -//proc/PID/statm,the value should multiply 4 +//proc/PID/stat typedef struct Proc_Mem_ { unsigned long vsz; //Virtual Memory Size, includes all memory that the process can access unsigned long rss; //Resident Set Size @@ -22,19 +23,21 @@ typedef struct Proc_Mem_ { typedef struct Proc_Info_ { unsigned int pid; char name[128]; - int point; //0-29 - Proc_CPU_Time cpuInfo[30]; - Proc_Mem memInfo[30]; + int point; //[0,UPDATE_FREQUENCY-1) + Proc_CPU_Time cpuInfo[UPDATE_FREQUENCY]; + Proc_Mem memInfo[UPDATE_FREQUENCY]; } Proc_Info; +//kill this process +void cleanProc_Info(Proc_Info *proc); + //kill this process void findProcListByMem(); //kill this process void findProcListByCPU(); -int Proc_List_Free_ID; -int Proc_List_ID; -Proc_Info Proc_List[64]; //max monitor 64 process +int Proc_List_CURRENT; +Proc_Info Proc_List[MONITOR_PROCESS_NUMBER]; //max monitor 64 process #endif //ATOP_MONITORPROCESS_H diff --git a/src/MonitorSys.c b/src/MonitorSys.c index ac3001b..6321b93 100644 --- a/src/MonitorSys.c +++ b/src/MonitorSys.c @@ -2,4 +2,22 @@ // Created by Iain on 2021/7/17. // -#include "MonitorSys.h" +#include +#include + +#define BUFFER_SIZE_MEMINFO 128 +#define SYSTEM_MEM_INFO_PATH "/proc/meminfo" + +void updateSystemMem(unsigned int *all, unsigned int *fre, float *useage) { + char buf[BUFFER_SIZE_MEMINFO]; /*缓冲区*/ + FILE *fp; /*文件指针*/ + if ((fp = fopen(SYSTEM_MEM_INFO_PATH, "r")) == NULL) { + perror("fail to read /proc/meminfo"); + return; + } + fgets(buf, BUFFER_SIZE_MEMINFO, fp); + sscanf(buf, "MemTotal: %u kB", all); + fgets(buf, BUFFER_SIZE_MEMINFO, fp); + sscanf(buf, "MemFree %u kB", fre); + *useage = 1 - (float) *fre / *all; +} diff --git a/src/MonitorSys.h b/src/MonitorSys.h index 34e41bf..5fa1cfc 100644 --- a/src/MonitorSys.h +++ b/src/MonitorSys.h @@ -12,4 +12,14 @@ typedef struct { unsigned long idle; } Total_CPU_Time; +struct memGlobal { + unsigned int All; + float Usage; + unsigned int Free; +} memG; + +struct cpuGlobal { + float Usage; +} cpuG; + #endif //ATOP_MONITORSYS_H