C 프로그램에서 CPU 사용 통계 가져오기

C 프로그램에서 CPU 사용 통계 가져오기

C 프로그램에서 CPU 사용률 통계를 읽고 싶습니다. CPU 사용률에 관심이 있습니다.시간을 훔치다등. 이러한 통계는 top명령의 세 번째 줄 에 표시됩니다 .

()를 사용하여 출력을 구문 분석해 보았지만 top올바른 통계를 표시하기 전에 항상 동일한 "가짜" 값을 제공하는 것 같습니다.awktop -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());그러다 매초마다 전화를 걸었어요

관련 정보