This example uses DosPerfSysCall to obtain CPU Utilization information on a uniprocessor.
#define INCL_BASE #include <os2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <perfutil.h> /* Convert 8-byte (low, high) time value to double */ #define LL2F(high, low) (4294967296.0*(high)+(low)) /* This is a 1 processor example */ void main (int argc, char *argv[]) { APIRET rc; int i, iter, sleep_sec; double ts_val, ts_val_prev; double idle_val, idle_val_prev; double busy_val, busy_val_prev; double intr_val, intr_val_prev; CPUUTIL CPUUtil; if ((argc < 2) || (*argv[1] < '1') || (*argv[1] > '9')) { fprintf(stderr, "usage: %s [1-9]\n", argv[0]); exit(0); } sleep_sec = *argv[1] - '0'; iter = 0; do { rc = DosPerfSysCall(CMD_KI_RDCNT,(ULONG) &CPUUtil,0,0); if (rc) { fprintf(stderr, "CMD_KI_RDCNT failed rc = %d\n",rc); exit(1); } ts_val = LL2F(CPUUtil.ulTimeHigh, CPUUtil.ulTimeLow); idle_val = LL2F(CPUUtil.ulIdleHigh, CPUUtil.ulIdleLow); busy_val = LL2F(CPUUtil.ulBusyHigh, CPUUtil.ulBusyLow); intr_val = LL2F(CPUUtil.ulIntrHigh, CPUUtil.ulIntrLow); if (iter > 0) { double ts_delta = ts_val - ts_val_prev; printf("idle: %4.2f%% busy: %4.2f%% intr: %4.2f%%\n", (idle_val - idle_val_prev)/ts_delta*100.0, (busy_val - busy_val_prev)/ts_delta*100.0, (intr_val - intr_val_prev)/ts_delta*100.0); } ts_val_prev = ts_val; idle_val_prev = idle_val; busy_val_prev = busy_val; intr_val_prev = intr_val; iter++; DosSleep(1000*sleep_sec); } while (1); }