merge light's code by hand
This commit is contained in:
parent
f40406bd0d
commit
6ff6a58132
@ -5,16 +5,33 @@
|
||||
#include "MonitorProcess.h"
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include<dirent.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -2,4 +2,22 @@
|
||||
// Created by Iain on 2021/7/17.
|
||||
//
|
||||
|
||||
#include "MonitorSys.h"
|
||||
#include<stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user