| #!/usr/bin/env perl |
| |
| use strict; |
| use warnings; |
| use Config; |
| |
| if (@ARGV < 2) { |
| die "Usage: $0 <prefix> <command...>\n"; |
| } |
| |
| sub gettime { |
| my ($sec, $usec); |
| |
| eval { |
| require Time::HiRes; |
| ($sec, $usec) = Time::HiRes::gettimeofday(); |
| }; |
| |
| unless (defined($sec) && defined($usec)) { |
| my $tv_t = ($Config{'longsize'} == 8) ? 'qq' : 'll'; |
| my $tv = pack $tv_t, 0, 0; |
| |
| eval { |
| require 'syscall.ph'; |
| syscall(SYS_gettimeofday(), $tv, 0); |
| }; |
| |
| ($sec, $usec) = unpack $tv_t, $tv; |
| } |
| |
| return ($sec, $usec); |
| } |
| |
| my ($prefix, @cmd) = @ARGV; |
| my ($sec, $usec) = gettime(); |
| my $pid = fork(); |
| |
| if (!defined($pid)) { |
| die "$0: Failure to fork(): $!\n"; |
| } |
| elsif ($pid == 0) { |
| exec(@cmd); |
| die "$0: Failure to exec(): $!\n"; |
| } |
| else { |
| $SIG{'INT'} = 'IGNORE'; |
| $SIG{'QUIT'} = 'IGNORE'; |
| |
| if (waitpid($pid, 0) == -1) { |
| die "$0: Failure to waitpid(): $!\n"; |
| } |
| |
| my $exitcode = $? >> 8; |
| my ($sec2, $usec2) = gettime(); |
| my (undef, undef, $cuser, $csystem) = times(); |
| |
| printf STDOUT "%s#%.2f#%.2f#%.2f\n", |
| $prefix, $cuser, $csystem, |
| ($sec2 - $sec) + ($usec2 - $usec) / 1000000; |
| |
| $SIG{'INT'} = 'DEFAULT'; |
| $SIG{'QUIT'} = 'DEFAULT'; |
| |
| exit $exitcode; |
| } |