blob: 11f86529bf7765e8faecb135d2d2018dfb594f8a [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2005 Silicon Graphics, Inc.
* All Rights Reserved.
*/
#include "command.h"
#include "input.h"
#include <sys/time.h>
#include <sys/resource.h>
#include "init.h"
#include "io.h"
static cmdinfo_t getrusage_cmd;
/*
* Report process resource utilisation. Formatting options:
* "Shell" format: 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w
* Verbose format:
* 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
* 0inputs+0outputs (0major+0minor)pagefaults 0swaps
* Comma Separated Value format: 0.000,0.000,00:00:00.00,0.0,0,0,0,0,0,0
*/
static int
getrusage_f(
int argc,
char **argv)
{
struct timeval wallclk, timenow;
struct rusage rusage;
double usrtime, systime, elapsed, pct_cpu;
char ts[64];
int Cflag, vflag;
int c;
Cflag = vflag = 0;
while ((c = getopt(argc, argv, "Cv")) != EOF) {
switch (c) {
case 'C':
Cflag = 1;
break;
case 'v':
vflag = 1;
break;
default:
return command_usage(&getrusage_cmd);
}
}
if (optind != argc)
return command_usage(&getrusage_cmd);
if (getrusage(RUSAGE_SELF, &rusage) < 0) {
perror("getrusage");
exitcode = 1;
return 0;
}
gettimeofday(&timenow, NULL);
wallclk = tsub(timenow, stopwatch);
elapsed = (double)wallclk.tv_sec +
((double)wallclk.tv_usec / 1000000.0);
usrtime = (double)rusage.ru_utime.tv_sec +
((double)rusage.ru_utime.tv_usec / 1000000.0);
systime = (double)rusage.ru_stime.tv_sec +
((double)rusage.ru_stime.tv_usec / 1000000.0);
if (elapsed < usrtime + systime)
pct_cpu = 100.0;
else
pct_cpu = ((usrtime + systime) / elapsed) * 100;
c = Cflag ? VERBOSE_FIXED_TIME : TERSE_FIXED_TIME;
timestr(&wallclk, ts, sizeof(ts), c);
if (Cflag)
printf("%.3f,%.3f,%s,%.1f,%ld,%ld,%ld,%ld,%ld,%ld,%ld\n",
usrtime, systime, ts, pct_cpu,
rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap,
rusage.ru_inblock, rusage.ru_oublock,
rusage.ru_nvcsw, rusage.ru_nivcsw);
else if (vflag)
printf("%.2fuser %.2fsystem %selapsed %.0f%%CPU "
"(%ldavgtext+%ldavgdata %ldmaxresident)k\n"
"%ldinputs+%ldoutputs "
"(%ldmajor+%ldminor)pagefaults %ldswaps\n",
usrtime, systime, ts, pct_cpu,
rusage.ru_ixrss, rusage.ru_idrss, rusage.ru_maxrss,
rusage.ru_inblock, rusage.ru_oublock,
rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap);
else
printf("%.3fu %.3fs %s %.1f%%\t"
"%ld+%ldk %ld+%ldio %ldpf+%ldw\n",
usrtime, systime, ts, pct_cpu,
rusage.ru_maxrss, rusage.ru_ixrss,
rusage.ru_inblock, rusage.ru_oublock,
rusage.ru_majflt, rusage.ru_nswap);
return 0;
}
void
getrusage_init(void)
{
getrusage_cmd.name = "getrusage";
getrusage_cmd.altname = "g";
getrusage_cmd.argmin = 0;
getrusage_cmd.argmax = -1;
getrusage_cmd.cfunc = getrusage_f;
getrusage_cmd.flags = CMD_NOFILE_OK | CMD_NOMAP_OK |
CMD_FOREIGN_OK | CMD_FLAG_ONESHOT;
getrusage_cmd.oneline = _("report process resource usage");
if (expert)
add_command(&getrusage_cmd);
}