C 프로그램에서 CPU 사용률 통계를 읽고 싶습니다. CPU 사용률에 관심이 있습니다.시간을 훔치다등. 이러한 통계는 top
명령의 세 번째 줄 에 표시됩니다 .
()를 사용하여 출력을 구문 분석해 보았지만 top
올바른 통계를 표시하기 전에 항상 동일한 "가짜" 값을 제공하는 것 같습니다.awk
top -n 1 -b | awk '{print $0}'
top
코드에서 또는 일부 명령의 출력을 구문 분석하여 CPU 사용률 통계를 얻는 방법이 있습니까?
편집하다:
플랫폼은 리눅스
감사해요.
답변1
읽고 싶은 처음 몇 줄 /proc/stat
. 측정된 시간만큼 분리하여 두 번 읽어야 하며, 그런 다음 두 번째 숫자 세트에서 첫 번째 숫자 세트를 빼야 합니다. 라인은 다음과 같습니다
cpu 1526724 408013 600675 541100340 2861417 528 14531 0 0 0
cpu0 344507 77818 251244 134816146 1119991 324 13283 0 0 0
cpu1 502614 324065 179301 133991407 1631824 136 906 0 0 0
cpu2 299080 3527 79456 136144067 103208 59 255 0 0 0
cpu3 380521 2602 90672 136148719 6393 7 86 0 0 0
intr 2111239193 344878476 16943 ...
첫 번째 행은 모든 코어의 집합입니다. 다음 몇 줄은 각 코어를 보여줍니다. 로 시작하는 줄이 보이면 intr
구문 분석을 중지해야 한다는 것을 알고 있습니다 .
각 숫자는 CPU가 특정 상태에서 소비하는 시간입니다. 단위는 일반적으로 100분의 1초입니다. 이러한 필드는 user
, nice
, system
, idle
, iowait
, irq
, softirq
, steal
, guest
및 입니다 guest_nice
.
신뢰할 수 있는 문서는 물론 소스 코드입니다. Linux 커널 소스 코드 사본이 있으면 fs/proc/stat.c
특히 show_stat
함수를 살펴보세요.
답변2
가지다몇 가지 예/proc/pid/stat
웹에서 C 언어로 읽는 방법을 보여줍니다 .
utime
서로 다른 두 시간에 OR 값을 읽고 stime
원하는 CPU 사용률 통계를 계산할 수 있습니다. ( top
이 원시 데이터도 사용하고 싶습니다 .)
(잊었습니다. 이것은 Linux에만 해당됩니다.)
답변3
나는 다음 sysinfo를 사용하여 이 작업을 수행했습니다. 여기에 스니펫이 있습니다.
#include "sysinfo.h"
getstat(cpu_use,cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz, pgpgin, pgpgout, pswpin, pswpout, intr, ctxt, &running,&blocked, &dummy_1, &dummy_2);
float cpuconsumption = (float) (( (float) ((*cpu_use) + (*cpu_sys)) / (float)((*cpu_use)+(*cpu_sys)+(*cpu_idl)))*100);
답변4
누구든지 ac 애플리케이션 내부의 상단에서 직접 빠른 CPU 사용량 값을 얻으려는 경우 이 코드 조각은 단순히 파이프를 열고 CPU 정보와 함께 최상위 프로세스의 마지막 줄을 반환합니다.
/**
* Get last cpu load as a string (not threadsafe)
*/
static char* getCpuLoadString()
{
/*
* Easiest seems to be just to read out a line from top, rather than trying to calc it ourselves through /proc stuff
*/
static bool started = false;
static char buffer[1024];
static char lastfullline[256];
static int bufdx;
static FILE *fp;
if(!started) {
/* Start the top command */
/* Open the command for reading. */
fp = popen("top -b -d1", "r");
if (fp == NULL) {
printf("Failed to run top command for profiling\n" );
exit(1);
}
/* Make nonblocking */
int flags;
flags = fcntl(fileno(fp), F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fileno(fp), F_SETFL, flags);
started = true;
}
/*
* Read out the latest info, and remember the last full line
*/
while( fgets (buffer + bufdx, sizeof(buffer) - bufdx, fp)!=NULL ) {
/* New data came in. Iteratively shift everything until a newline into the last full line */
char *newlinep;
while((newlinep = strstr(buffer, "\n"))) {
int shiftsize = (newlinep - buffer + 1);
*newlinep = 0; /* Nullterminate it for strcpy and strstr */
/* Check if the line contained "cpu" */
if(strstr(buffer, "Cpu")) {
strncpy(lastfullline, buffer, sizeof(lastfullline) - 1); /* Copy full line if it contained cpu info */
}
memmove(buffer, buffer + shiftsize, shiftsize); /* Shift left (and discard) the line we just consumed */
}
}
/*
* Return the last line we processed as valid output
*/
return lastfullline;
}
printf(" %s\n", getCpuLoadString());
그러다 매초마다 전화를 걸었어요