Implement the usertime and systime keywords for ps, printing the

corresponding times reported by getrusage().

Submitted by:	Dan Nelson <dnelson allantgroup com>
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2011-03-17 11:25:32 +00:00
parent ffda66c299
commit a870bf2c31
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=219713
4 changed files with 63 additions and 21 deletions

View File

@ -81,12 +81,14 @@ int s_uname(KINFO *);
void showkey(void);
void started(KINFO *, VARENT *);
void state(KINFO *, VARENT *);
void systime(KINFO *, VARENT *);
void tdev(KINFO *, VARENT *);
void tdnam(KINFO *, VARENT *);
void tname(KINFO *, VARENT *);
void ucomm(KINFO *, VARENT *);
void uname(KINFO *, VARENT *);
void upr(KINFO *, VARENT *);
void usertime(KINFO *, VARENT *);
void vsize(KINFO *, VARENT *);
void wchan(KINFO *, VARENT *);
__END_DECLS

View File

@ -189,6 +189,7 @@ static VAR var[] = {
UINT, UIDFMT, 0},
{"svuid", "SVUID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_svuid),
UINT, UIDFMT, 0},
{"systime", "SYSTIME", NULL, USER, systime, NULL, 9, 0, CHAR, NULL, 0},
{"tdaddr", "TDADDR", NULL, 0, kvar, NULL, sizeof(void *) * 2,
KOFF(ki_tdaddr), KPTR, "lx", 0},
{"tdev", "TDEV", NULL, 0, tdev, NULL, 5, 0, CHAR, NULL, 0},
@ -210,6 +211,8 @@ static VAR var[] = {
KOFF(ki_paddr), KPTR, "lx", 0},
{"user", "USER", NULL, LJUST|DSIZ, uname, s_uname, USERLEN, 0, CHAR,
NULL, 0},
{"usertime", "USERTIME", NULL, USER, usertime, NULL, 9, 0, CHAR, NULL,
0},
{"usrpri", "", "upr", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
{"vsize", "", "vsz", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
{"vsz", "VSZ", NULL, 0, vsize, NULL, 6, 0, CHAR, NULL, 0},

View File

@ -550,12 +550,11 @@ vsize(KINFO *k, VARENT *ve)
(void)printf("%*lu", v->width, (u_long)(k->ki_p->ki_size / 1024));
}
void
cputime(KINFO *k, VARENT *ve)
static void
printtime(KINFO *k, VARENT *ve, long secs, long psecs)
/* psecs is "parts" of a second. first micro, then centi */
{
VAR *v;
long secs;
long psecs; /* "parts" of a second. first micro, then centi */
char obuff[128];
static char decimal_point;
@ -566,20 +565,7 @@ cputime(KINFO *k, VARENT *ve)
secs = 0;
psecs = 0;
} else {
/*
* This counts time spent handling interrupts. We could
* fix this, but it is not 100% trivial (and interrupt
* time fractions only work on the sparc anyway). XXX
*/
secs = k->ki_p->ki_runtime / 1000000;
psecs = k->ki_p->ki_runtime % 1000000;
if (sumrusage) {
secs += k->ki_p->ki_childtime.tv_sec;
psecs += k->ki_p->ki_childtime.tv_usec;
}
/*
* round and scale to 100's
*/
/* round and scale to 100's */
psecs = (psecs + 5000) / 10000;
secs += psecs / 100;
psecs = psecs % 100;
@ -589,6 +575,53 @@ cputime(KINFO *k, VARENT *ve)
(void)printf("%*s", v->width, obuff);
}
void
cputime(KINFO *k, VARENT *ve)
{
long secs, psecs;
/*
* This counts time spent handling interrupts. We could
* fix this, but it is not 100% trivial (and interrupt
* time fractions only work on the sparc anyway). XXX
*/
secs = k->ki_p->ki_runtime / 1000000;
psecs = k->ki_p->ki_runtime % 1000000;
if (sumrusage) {
secs += k->ki_p->ki_childtime.tv_sec;
psecs += k->ki_p->ki_childtime.tv_usec;
}
printtime(k, ve, secs, psecs);
}
void
systime(KINFO *k, VARENT *ve)
{
long secs, psecs;
secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
psecs = k->ki_p->ki_rusage.ru_stime.tv_usec;
if (sumrusage) {
secs += k->ki_p->ki_childstime.tv_sec;
psecs += k->ki_p->ki_childstime.tv_usec;
}
printtime(k, ve, secs, psecs);
}
void
usertime(KINFO *k, VARENT *ve)
{
long secs, psecs;
secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
psecs = k->ki_p->ki_rusage.ru_utime.tv_usec;
if (sumrusage) {
secs += k->ki_p->ki_childutime.tv_sec;
psecs += k->ki_p->ki_childutime.tv_usec;
}
printtime(k, ve, secs, psecs);
}
void
elapsed(KINFO *k, VARENT *ve)
{

View File

@ -29,7 +29,7 @@
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
.Dd March 5, 2011
.Dd March 16, 2011
.Dt PS 1
.Os
.Sh NAME
@ -205,8 +205,8 @@ Display information about processes which match the specified process IDs.
Sort by current CPU usage, instead of the combination of controlling
terminal and process ID.
.It Fl S
Change the way the process time is calculated by summing all exited
children to their parent process.
Change the way the process times, namely cputime, systime, and usertime,
are calculated by summing all exited children to their parent process.
.It Fl T
Display information about processes attached to the device associated
with the standard input.
@ -596,6 +596,8 @@ symbolic process state (alias
saved gid from a setgid executable
.It Cm svuid
saved UID from a setuid executable
.It Cm systime
accumulated system CPU time
.It Cm tdaddr
thread address
.It Cm tdev
@ -626,6 +628,8 @@ scheduling priority on return from system call (alias
.Cm usrpri )
.It Cm user
user name (from UID)
.It Cm usertime
accumulated user CPU time
.It Cm vsz
virtual size in Kbytes (alias
.Cm vsize )