add time. do not mark complete/POSIX compliant as exit status is wrong.
This commit is contained in:
parent
7cc4ef0734
commit
5c8d5c1dca
1
Makefile
1
Makefile
|
@ -137,6 +137,7 @@ BIN =\
|
||||||
tar\
|
tar\
|
||||||
tee\
|
tee\
|
||||||
test\
|
test\
|
||||||
|
time\
|
||||||
touch\
|
touch\
|
||||||
tr\
|
tr\
|
||||||
true\
|
true\
|
||||||
|
|
1
README
1
README
|
@ -74,6 +74,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
|
||||||
=* tar non-posix none
|
=* tar non-posix none
|
||||||
=* tee yes none
|
=* tee yes none
|
||||||
=* test yes none
|
=* test yes none
|
||||||
|
= time no none (incorrect exit status)
|
||||||
=* touch yes none
|
=* touch yes none
|
||||||
#* tr yes none
|
#* tr yes none
|
||||||
=* true yes none
|
=* true yes none
|
||||||
|
|
63
time.c
Normal file
63
time.c
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/times.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
eprintf("usage: %s [-p] utility [argument ...]\n", argv0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
struct tms tms; /* hold user and sys times */
|
||||||
|
clock_t rbeg, rend; /* real time */
|
||||||
|
long ticks; /* per second */
|
||||||
|
int status;
|
||||||
|
|
||||||
|
ARGBEGIN {
|
||||||
|
case 'p':
|
||||||
|
/* used to specify POSIX output format, but that's the only format we
|
||||||
|
* have for now */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
} ARGEND;
|
||||||
|
|
||||||
|
if (!*argv)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
if ((ticks = sysconf(_SC_CLK_TCK)) < 0)
|
||||||
|
eprintf("sysconf() failed to retrieve clock ticks per second:");
|
||||||
|
|
||||||
|
if ((rbeg = times(&tms)) < 0) /* POSIX doesn't say NULL is ok... */
|
||||||
|
eprintf("times() failed to retrieve start times:");
|
||||||
|
|
||||||
|
if (!(pid = fork())) { /* child */
|
||||||
|
execvp(*argv, argv);
|
||||||
|
/* FIXME: check errno for POSIX exit status
|
||||||
|
* 126: found could not be invoked
|
||||||
|
* 127: could not be found
|
||||||
|
* problem is some like EACCESS can mean either...
|
||||||
|
* worth doing manual path search for correct value? also gives more
|
||||||
|
* accurate time as the patch search wouldn't be included in child's
|
||||||
|
* user/sys times... */
|
||||||
|
enprintf(127, "failed to exec %s:", *argv);
|
||||||
|
}
|
||||||
|
waitpid(pid, &status, 0);
|
||||||
|
|
||||||
|
if ((rend = times(&tms)) < 0)
|
||||||
|
eprintf("times() failed to retrieve end times:");
|
||||||
|
|
||||||
|
fprintf(stderr, "real %f\nuser %f\nsys %f\n",
|
||||||
|
(rend - rbeg) / (double)ticks,
|
||||||
|
tms.tms_cutime / (double)ticks,
|
||||||
|
tms.tms_cstime / (double)ticks);
|
||||||
|
|
||||||
|
return WIFEXITED(status) ? WEXITSTATUS(status) : 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user