sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats — get cpu usage


#include <statgrab.h>
sg_cpu_percents *sg_get_cpu_percents(entries); 
size_t *entries;
sg_cpu_percents *sg_get_cpu_percents_of(cps,  
sg_cpu_percent_source cps;
size_t *entries;
sg_cpu_percents *sg_get_cpu_percents_r(whereof,  
const sg_cpu_stats *whereof;
size_t *entries;
void sg_free_cpu_percents(data); 
sg_cpu_percents *data;
sg_cpu_stats *sg_get_cpu_stats(entries); 
size_t *entries;
sg_cpu_stats *sg_get_cpu_stats_diff(entries); 
size_t *entries;
sg_cpu_stats *sg_get_cpu_stats_r(entries); 
size_t *entries;
sg_cpu_stats *sg_get_cpu_stats_diff_between(cpu_nowcpu_last,  
const sg_cpu_stats *cpu_now, const sg_cpu_stats *cpu_last;
size_t *entries;
sg_error sg_free_cpu_stats(data); 
sg_cpu_stats *data;


These are the categories of data delivered by the cpu stats module: sg_get_cpu_stats() and sg_get_cpu_stats_r() deliver native cpu counters since the machine has been started, sg_get_cpu_stats_diff() and sg_get_cpu_stats_diff_between() deliver native cpu counters between two sg_get_cpu_stats() calls and sg_get_cpu_percents_of() and sg_get_cpu_percents_r() deliver correlated relative cpu counters (where total is 100%).

Table 1. API Shortcut

functionreturnsdata owner
sg_get_cpu_statssg_cpu_stats *libstatgrab (thread local)
sg_get_cpu_stats_rsg_cpu_stats *caller
sg_get_cpu_stats_diffsg_cpu_stats *libstatgrab (thread local)
sg_get_cpu_stats_diff_betweensg_cpu_stats *caller
sg_get_cpu_percents_ofsg_cpu_percents *libstatgrab (thread local)
sg_get_cpu_percents_rsg_cpu_percents *caller

The sg_cpu_stats buffer received from sg_get_cpu_stats_r() and the sg_get_cpu_stats_diff_between() as well as the sg_cpu_percents buffer received from sg_get_cpu_percents_r() must be freed using sg_free_cpu_stats() or the sg_free_cpu_percents(), respectively, when not needed any more. The caller is responsible for doing it.

The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example.

Modern systems shall provide information about the clock tick resolution by invoking sysconf(_SC_CLK_TCK).

Return Values

There are two structures returned by the CPU statistics functions.

typedef struct {
        unsigned long long user;
        unsigned long long kernel;
        unsigned long long idle;
        unsigned long long iowait;
        unsigned long long swap;
        unsigned long long nice;
        unsigned long long total;

        unsigned long long context_switches;
        unsigned long long voluntary_context_switches;
        unsigned long long involuntary_context_switches;
        unsigned long long syscalls;
        unsigned long long interrupts;
        unsigned long long soft_interrupts;

        time_t systime;
} sg_cpu_stats;
typedef struct {
        double user;
        double kernel;
        double idle;
        double iowait;
        double swap;
        double nice;
        time_t time_taken;
} sg_cpu_percents;
user kernel idle iowait swap nice total

The different CPU states.

context_switches voluntary_context_switches involuntary_context_switches syscalls interrupts soft_interrupts

The different program actions on CPU.

systime time_taken

The time taken in seconds since the last call of the function, or the system time.

See Also