diff options
Diffstat (limited to 'bin/ksh')
-rw-r--r-- | bin/ksh/c_sh.c | 116 | ||||
-rw-r--r-- | bin/ksh/jobs.c | 30 | ||||
-rw-r--r-- | bin/ksh/ksh.1 | 36 | ||||
-rw-r--r-- | bin/ksh/ksh.1tbl | 36 | ||||
-rw-r--r-- | bin/ksh/sh.1 | 11 | ||||
-rw-r--r-- | bin/ksh/sh.1tbl | 11 |
6 files changed, 140 insertions, 100 deletions
diff --git a/bin/ksh/c_sh.c b/bin/ksh/c_sh.c index f31c2c0a013..ef25f3d9a1b 100644 --- a/bin/ksh/c_sh.c +++ b/bin/ksh/c_sh.c @@ -1,15 +1,15 @@ -/* $OpenBSD: c_sh.c,v 1.24 2004/12/22 17:14:34 millert Exp $ */ +/* $OpenBSD: c_sh.c,v 1.25 2004/12/22 18:48:56 millert Exp $ */ /* * built-in Bourne commands */ #include "sh.h" -#include <sys/stat.h> /* umask() */ -#include <sys/times.h> - -static char *clocktos(clock_t); +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/resource.h> +static void p_time(struct shf *, int, struct timeval *, int, char *, char *); /* :, false and true */ int @@ -669,16 +669,36 @@ c_unset(char **wp) return ret; } +static void +p_time(shf, posix, tv, width, prefix, suffix) + struct shf *shf; + int posix; + struct timeval *tv; + int width; + char *prefix; + char *suffix; +{ + if (posix) + shf_fprintf(shf, "%s%*ld.%02ld%s", prefix ? prefix : "", + width, tv->tv_sec, tv->tv_usec / 10000, suffix); + else + shf_fprintf(shf, "%s%*ldm%ld.%02lds%s", prefix ? prefix : "", + width, tv->tv_sec / 60, tv->tv_sec % 60, + tv->tv_usec / 10000, suffix); +} + int c_times(char **wp) { - struct tms all; + struct rusage usage; + + (void) getrusage(RUSAGE_SELF, &usage); + p_time(shl_stdout, 0, &usage.ru_utime, 0, NULL, " "); + p_time(shl_stdout, 0, &usage.ru_stime, 0, NULL, "\n"); - (void) times(&all); - shprintf("Shell: %8ss user ", clocktos(all.tms_utime)); - shprintf("%8ss system\n", clocktos(all.tms_stime)); - shprintf("Kids: %8ss user ", clocktos(all.tms_cutime)); - shprintf("%8ss system\n", clocktos(all.tms_cstime)); + (void) getrusage(RUSAGE_CHILDREN, &usage); + p_time(shl_stdout, 0, &usage.ru_utime, 0, NULL, " "); + p_time(shl_stdout, 0, &usage.ru_stime, 0, NULL, "\n"); return 0; } @@ -693,13 +713,15 @@ timex(struct op *t, int f) #define TF_NOREAL BIT(1) /* don't report real time */ #define TF_POSIX BIT(2) /* report in posix format */ int rv = 0; - struct tms t0, t1, tms; - clock_t t0t, t1t = 0; + struct rusage ru0, ru1, cru0, cru1; + struct timeval usrtime, systime, tv0, tv1; int tf = 0; - extern clock_t j_usrtime, j_systime; /* computed by j_wait */ + extern struct timeval j_usrtime, j_systime; /* computed by j_wait */ char opts[1]; - t0t = times(&t0); + gettimeofday(&tv0, NULL); + getrusage(RUSAGE_SELF, &ru0); + getrusage(RUSAGE_CHILDREN, &cru0); if (t->left) { /* * Two ways of getting cpu usage of a command: just use t0 @@ -709,33 +731,45 @@ timex(struct op *t, int f) * pdksh tries to do the later (the j_usrtime hack doesn't * really work as it only counts the last job). */ - j_usrtime = j_systime = 0; + timerclear(&j_usrtime); + timerclear(&j_systime); if (t->left->type == TCOM) t->left->str = opts; opts[0] = 0; rv = execute(t->left, f | XTIME); tf |= opts[0]; - t1t = times(&t1); + gettimeofday(&tv1, NULL); + getrusage(RUSAGE_SELF, &ru1); + getrusage(RUSAGE_CHILDREN, &cru1); } else tf = TF_NOARGS; if (tf & TF_NOARGS) { /* ksh93 - report shell times (shell+kids) */ tf |= TF_NOREAL; - tms.tms_utime = t0.tms_utime + t0.tms_cutime; - tms.tms_stime = t0.tms_stime + t0.tms_cstime; + timeradd(&ru0.ru_utime, &cru0.ru_utime, &usrtime); + timeradd(&ru0.ru_stime, &cru0.ru_stime, &systime); } else { - tms.tms_utime = t1.tms_utime - t0.tms_utime + j_usrtime; - tms.tms_stime = t1.tms_stime - t0.tms_stime + j_systime; + timersub(&ru1.ru_utime, &ru0.ru_utime, &usrtime); + timeradd(&usrtime, &j_usrtime, &usrtime); + timersub(&ru1.ru_stime, &ru0.ru_stime, &systime); + timeradd(&systime, &j_systime, &systime); } - if (!(tf & TF_NOREAL)) - shf_fprintf(shl_out, - tf & TF_POSIX ? "real %8s\n" : "%8ss real ", - clocktos(t1t - t0t)); - shf_fprintf(shl_out, tf & TF_POSIX ? "user %8s\n" : "%8ss user ", - clocktos(tms.tms_utime)); - shf_fprintf(shl_out, tf & TF_POSIX ? "sys %8s\n" : "%8ss system\n", - clocktos(tms.tms_stime)); + if (!(tf & TF_NOREAL)) { + timersub(&tv1, &tv0, &tv1); + if (tf & TF_POSIX) + p_time(shl_out, 1, &tv1, 5, "real ", "\n"); + else + p_time(shl_out, 0, &tv1, 5, NULL, " real "); + } + if (tf & TF_POSIX) + p_time(shl_out, 1, &usrtime, 5, "user ", "\n"); + else + p_time(shl_out, 0, &usrtime, 5, NULL, " user "); + if (tf & TF_POSIX) + p_time(shl_out, 1, &systime, 5, "sys ", "\n"); + else + p_time(shl_out, 0, &systime, 5, NULL, " system\n"); shf_flush(shl_out); return rv; @@ -774,30 +808,6 @@ timex_hook(struct op *t, char **volatile *app) *app = wp; } -static char * -clocktos(clock_t t) -{ - static char temp[22]; /* enough for 64 bit clock_t */ - int i; - char *cp = temp + sizeof(temp); - - /* note: posix says must use max precision, ie, if clk_tck is - * 1000, must print 3 places after decimal (if non-zero, else 1). - */ - if (CLK_TCK != 100) /* convert to 1/100'ths */ - t = (t < 1000000000/CLK_TCK) ? - (t * 100) / CLK_TCK : (t / CLK_TCK) * 100; - - *--cp = '\0'; - for (i = -2; i <= 0 || t > 0; i++) { - if (i == 0) - *--cp = '.'; - *--cp = '0' + (char)(t%10); - t /= 10; - } - return cp; -} - /* exec with no args - args case is taken care of in comexec() */ int c_exec(char **wp) diff --git a/bin/ksh/jobs.c b/bin/ksh/jobs.c index ecd04520a06..65851bf1845 100644 --- a/bin/ksh/jobs.c +++ b/bin/ksh/jobs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: jobs.c,v 1.29 2004/12/22 17:14:34 millert Exp $ */ +/* $OpenBSD: jobs.c,v 1.30 2004/12/22 18:48:56 millert Exp $ */ /* * Process and job control @@ -18,7 +18,8 @@ #include "sh.h" #include <sys/stat.h> #include <sys/wait.h> -#include <sys/times.h> +#include <sys/time.h> +#include <sys/resource.h> #include "tty.h" /* Order important! */ @@ -71,8 +72,8 @@ struct job { pid_t pgrp; /* process group of job */ pid_t ppid; /* pid of process that forked job */ INT32 age; /* number of jobs started */ - clock_t systime; /* system time used by job */ - clock_t usrtime; /* user time used by job */ + struct timeval systime; /* system time used by job */ + struct timeval usrtime; /* user time used by job */ Proc *proc_list; /* process list */ Proc *last_proc; /* last process in list */ Coproc_id coproc_id; /* 0 or id of coprocess output pipe */ @@ -101,7 +102,7 @@ static const char *const lookup_msgs[] = { "argument must be %job or process id", (char *) 0 }; -clock_t j_systime, j_usrtime; /* user and system time of last j_waitjed job */ +struct timeval j_systime, j_usrtime; /* user and system time of last j_waitjed job */ static Job *job_list; /* job list */ static Job *last_job; @@ -364,7 +365,8 @@ exchild(struct op *t, int flags, */ j->flags = (flags & XXCOM) ? JF_XXCOM : ((flags & XBGND) ? 0 : (JF_FG|JF_USETTYMODE)); - j->usrtime = j->systime = 0; + timerclear(&j->usrtime); + timerclear(&j->systime); j->state = PRUNNING; j->pgrp = 0; j->ppid = procpid; @@ -1080,7 +1082,7 @@ j_sigchld(int sig) Proc *p = NULL; int pid; int status; - struct tms t0, t1; + struct rusage ru0, ru1; /* Don't wait for any processes if a job is partially started. * This is so we don't do away with the process group leader @@ -1093,14 +1095,14 @@ j_sigchld(int sig) return; } - times(&t0); + getrusage(RUSAGE_CHILDREN, &ru0); do { pid = waitpid(-1, &status, (WNOHANG|WUNTRACED)); if (pid <= 0) /* return if would block (0) ... */ break; /* ... or no children or interrupted (-1) */ - times(&t1); + getrusage(RUSAGE_CHILDREN, &ru1); /* find job and process structures for this pid */ for (j = job_list; j != (Job *) 0; j = j->next) @@ -1113,13 +1115,15 @@ found: warningf(true, "bad process waited for (pid = %d)", pid); */ - t0 = t1; + ru0 = ru1; continue; } - j->usrtime += t1.tms_cutime - t0.tms_cutime; - j->systime += t1.tms_cstime - t0.tms_cstime; - t0 = t1; + timeradd(&j->usrtime, &ru1.ru_utime, &j->usrtime); + timersub(&j->usrtime, &ru0.ru_utime, &j->usrtime); + timeradd(&j->systime, &ru1.ru_stime, &j->systime); + timersub(&j->systime, &ru0.ru_stime, &j->systime); + ru0 = ru1; p->status = status; #ifdef JOBS if (WIFSTOPPED(status)) diff --git a/bin/ksh/ksh.1 b/bin/ksh/ksh.1 index 74391cdc99d..0c9330b1599 100644 --- a/bin/ksh/ksh.1 +++ b/bin/ksh/ksh.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ksh.1,v 1.82 2004/12/16 02:10:59 jaredy Exp $ +.\" $OpenBSD: ksh.1,v 1.83 2004/12/22 18:48:56 millert Exp $ .\" .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -3980,21 +3980,24 @@ the user CPU time (time spent running in user mode), and the system CPU time (time spent running in kernel mode). Times are reported to standard error; the format of the output is: .Pp -.Dl 0.00s real 0.00s user 0.00s system +.Dl "0m0.00s real 0m0.00s user 0m0.00s system" .Pp -unless the +If the .Fl p -option is given (only possible if -.Ar pipeline -is a simple command), in which case the output is slightly longer: +option is given the output is slightly longer: +.Bd -literal -offset indent +real 0.00 +user 0.00 +sys 0.00 +.Ed .Pp -.Dl real 0.00 -.Dl user 0.00 -.Dl sys 0.00 +It is an error to specify the +.Fl p +option unless +.Ar pipeline +is a simple command. .Pp -(the number of digits after the decimal may vary from system to system). -Note -that simple redirections of standard error do not effect the output of the +Simple redirections of standard error do not effect the output of the .Ic time command: .Pp @@ -4005,8 +4008,13 @@ Times for the first command do not go to .Dq afile , but those of the second command do. .It Ic times -Print the accumulated user and system times used by the shell and by processes -which have exited that the shell started. +Print the accumulated user and system times used both by the shell +and by processes that the shell started which have exited. +The format of the output is: +.Bd -literal -offset indent +0m0.00s 0m0.00s +0m0.00s 0m0.00s +.Ed .It Ic trap Op Ar handler signal ... Sets a trap handler that is to be executed when any of the specified signals are received. diff --git a/bin/ksh/ksh.1tbl b/bin/ksh/ksh.1tbl index eb6c0548444..db6d1a57454 100644 --- a/bin/ksh/ksh.1tbl +++ b/bin/ksh/ksh.1tbl @@ -1,4 +1,4 @@ -.\" $OpenBSD: ksh.1tbl,v 1.82 2004/12/16 02:10:59 jaredy Exp $ +.\" $OpenBSD: ksh.1tbl,v 1.83 2004/12/22 18:48:56 millert Exp $ .\" .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -3980,21 +3980,24 @@ the user CPU time (time spent running in user mode), and the system CPU time (time spent running in kernel mode). Times are reported to standard error; the format of the output is: .Pp -.Dl 0.00s real 0.00s user 0.00s system +.Dl "0m0.00s real 0m0.00s user 0m0.00s system" .Pp -unless the +If the .Fl p -option is given (only possible if -.Ar pipeline -is a simple command), in which case the output is slightly longer: +option is given the output is slightly longer: +.Bd -literal -offset indent +real 0.00 +user 0.00 +sys 0.00 +.Ed .Pp -.Dl real 0.00 -.Dl user 0.00 -.Dl sys 0.00 +It is an error to specify the +.Fl p +option unless +.Ar pipeline +is a simple command. .Pp -(the number of digits after the decimal may vary from system to system). -Note -that simple redirections of standard error do not effect the output of the +Simple redirections of standard error do not effect the output of the .Ic time command: .Pp @@ -4005,8 +4008,13 @@ Times for the first command do not go to .Dq afile , but those of the second command do. .It Ic times -Print the accumulated user and system times used by the shell and by processes -which have exited that the shell started. +Print the accumulated user and system times used both by the shell +and by processes that the shell started which have exited. +The format of the output is: +.Bd -literal -offset indent +0m0.00s 0m0.00s +0m0.00s 0m0.00s +.Ed .It Ic trap Op Ar handler signal ... Sets a trap handler that is to be executed when any of the specified signals are received. diff --git a/bin/ksh/sh.1 b/bin/ksh/sh.1 index fb43b599d24..fce1d6b72d8 100644 --- a/bin/ksh/sh.1 +++ b/bin/ksh/sh.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sh.1,v 1.55 2004/12/12 17:37:45 jmc Exp $ +.\" $OpenBSD: sh.1,v 1.56 2004/12/22 18:48:56 millert Exp $ .\" .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -3256,8 +3256,13 @@ Use tests like .Ic if \&[ \&"X$foo\&" = Xbar \&] instead. .It Ic times -Print the accumulated user and system times used by the shell and by processes -which have exited that the shell started. +Print the accumulated user and system times used both by the shell +and by processes that the shell started which have exited. +The format of the output is: +.Bd -literal -offset indent +0m0.00s 0m0.00s +0m0.00s 0m0.00s +.Ed .It Ic trap Op Ar handler signal ... Sets a trap handler that is to be executed when any of the specified signals are received. diff --git a/bin/ksh/sh.1tbl b/bin/ksh/sh.1tbl index ccf5c262efc..cdcd8b5d41a 100644 --- a/bin/ksh/sh.1tbl +++ b/bin/ksh/sh.1tbl @@ -1,4 +1,4 @@ -.\" $OpenBSD: sh.1tbl,v 1.55 2004/12/12 17:37:45 jmc Exp $ +.\" $OpenBSD: sh.1tbl,v 1.56 2004/12/22 18:48:56 millert Exp $ .\" .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -3256,8 +3256,13 @@ Use tests like .Ic if \&[ \&"X$foo\&" = Xbar \&] instead. .It Ic times -Print the accumulated user and system times used by the shell and by processes -which have exited that the shell started. +Print the accumulated user and system times used both by the shell +and by processes that the shell started which have exited. +The format of the output is: +.Bd -literal -offset indent +0m0.00s 0m0.00s +0m0.00s 0m0.00s +.Ed .It Ic trap Op Ar handler signal ... Sets a trap handler that is to be executed when any of the specified signals are received. |