summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-03-17 11:25:32 +0000
committerkib <kib@FreeBSD.org>2011-03-17 11:25:32 +0000
commit425e556ac9cfcee7074d9eae8e246690de567ea7 (patch)
treed85b94710406af532df69f8fe797bc215a6ec248 /bin
parent329130799d270217d976d559253a838c169cd221 (diff)
downloadFreeBSD-src-425e556ac9cfcee7074d9eae8e246690de567ea7.zip
FreeBSD-src-425e556ac9cfcee7074d9eae8e246690de567ea7.tar.gz
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
Diffstat (limited to 'bin')
-rw-r--r--bin/ps/extern.h2
-rw-r--r--bin/ps/keyword.c3
-rw-r--r--bin/ps/print.c69
-rw-r--r--bin/ps/ps.110
4 files changed, 63 insertions, 21 deletions
diff --git a/bin/ps/extern.h b/bin/ps/extern.h
index faeeb19..eb1ede6 100644
--- a/bin/ps/extern.h
+++ b/bin/ps/extern.h
@@ -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
diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c
index 3bcc23b..09eb756 100644
--- a/bin/ps/keyword.c
+++ b/bin/ps/keyword.c
@@ -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},
diff --git a/bin/ps/print.c b/bin/ps/print.c
index 46b979b..253793a 100644
--- a/bin/ps/print.c
+++ b/bin/ps/print.c
@@ -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;
@@ -590,6 +576,53 @@ cputime(KINFO *k, VARENT *ve)
}
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)
{
VAR *v;
diff --git a/bin/ps/ps.1 b/bin/ps/ps.1
index 5ae7c54..d6b4653 100644
--- a/bin/ps/ps.1
+++ b/bin/ps/ps.1
@@ -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 )
OpenPOWER on IntegriCloud