mirror of
https://github.com/OpenSolo/OpenSolo.git
synced 2025-04-30 14:44:31 +02:00
118 lines
3.2 KiB
C
118 lines
3.2 KiB
C
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include "util.h"
|
|
#include "proc_table.h"
|
|
|
|
#define MAX_PROC_ENTRIES 100
|
|
static proc_entry_t proc_table_1[MAX_PROC_ENTRIES];
|
|
static proc_entry_t proc_table_2[MAX_PROC_ENTRIES];
|
|
static proc_entry_t proc_table_3[MAX_PROC_ENTRIES];
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
FILE *fp = stdout;
|
|
int proc_entries_1;
|
|
int proc_entries_2;
|
|
int proc_entries_3;
|
|
int i;
|
|
proc_entry_t *pt1;
|
|
proc_entry_t *pt2;
|
|
proc_entry_t *ptx;
|
|
int *pe1;
|
|
int *pe2;
|
|
int *pex;
|
|
uint64_t now_us;
|
|
uint64_t next_us;
|
|
long unsigned percent;
|
|
char time_buf[32];
|
|
long unsigned sum;
|
|
const unsigned interval_us = 10000000;
|
|
const unsigned hz = 100;
|
|
const unsigned interval_jiffies = (interval_us * hz) / 1000000;
|
|
|
|
/* one argument; if supplied, it's the output filename */
|
|
if (argc > 1) {
|
|
FILE *fp2 = fopen(argv[1], "a");
|
|
if (fp2 != NULL)
|
|
fp = fp2;
|
|
}
|
|
|
|
now_us = clock_gettime_us(CLOCK_REALTIME);
|
|
fprintf(fp, "\n");
|
|
fprintf(fp, "%s proc_top starting\n", clock_tostr_r(now_us, time_buf));
|
|
|
|
next_us = clock_gettime_us(CLOCK_MONOTONIC) + interval_us;
|
|
|
|
proc_entries_1 = MAX_PROC_ENTRIES;
|
|
if (proc_table_get(proc_table_1, &proc_entries_1) != 0) {
|
|
fprintf(stderr, "ERROR reading proc table\n");
|
|
exit(1);
|
|
}
|
|
|
|
pt1 = proc_table_1;
|
|
pt2 = proc_table_2;
|
|
pe1 = &proc_entries_1;
|
|
pe2 = &proc_entries_2;
|
|
|
|
while (1) {
|
|
now_us = clock_gettime_us(CLOCK_MONOTONIC);
|
|
if (next_us > now_us)
|
|
usleep(next_us - now_us);
|
|
next_us += interval_us;
|
|
|
|
now_us = clock_gettime_us(CLOCK_REALTIME);
|
|
|
|
*pe2 = MAX_PROC_ENTRIES;
|
|
if (proc_table_get(pt2, pe2) != 0) {
|
|
fprintf(stderr, "ERROR reading proc table\n");
|
|
exit(1);
|
|
}
|
|
|
|
proc_entries_3 = MAX_PROC_ENTRIES;
|
|
proc_table_diff(pt1, *pe1, pt2, *pe2, proc_table_3, &proc_entries_3);
|
|
|
|
proc_table_top(proc_table_3, proc_entries_3);
|
|
|
|
fprintf(fp, "\n");
|
|
fprintf(fp, "%s\n", clock_tostr_r(now_us, time_buf));
|
|
fprintf(fp, "%6s %-20s %6s %6s %4s\n", "pid", "name", "utime", "stime", "pct");
|
|
for (i = 0; i < proc_entries_3; i++) {
|
|
#if 0
|
|
/* Quit printing when the total time becomes zero. This prints
|
|
a lot of nearly-idle tasks. */
|
|
if (proc_table_3[i].utime == 0 && proc_table_3[i].stime == 0)
|
|
break;
|
|
#endif
|
|
sum = proc_table_3[i].utime + proc_table_3[i].stime;
|
|
percent = (100 * sum + interval_jiffies / 2) / interval_jiffies;
|
|
#if 1
|
|
/* Quit printing when the the percentage rounds to zero. The
|
|
CPU usage is *not* zero, but this gives us a handful (~5)
|
|
of tasks per dump. */
|
|
if (percent == 0)
|
|
break;
|
|
#endif
|
|
fprintf(fp, "%6d %-20s %6lu %6lu %3lu%%\n", proc_table_3[i].pid, proc_table_3[i].comm,
|
|
proc_table_3[i].utime, proc_table_3[i].stime, percent);
|
|
}
|
|
|
|
fflush(fp);
|
|
|
|
/* swap tables */
|
|
|
|
ptx = pt1;
|
|
pt1 = pt2;
|
|
pt2 = ptx;
|
|
|
|
pex = pe1;
|
|
pe1 = pe2;
|
|
pe2 = pex;
|
|
|
|
} /* while (1) */
|
|
|
|
exit(0);
|
|
|
|
} /* main */
|