#include #include #include #include #include #include #include #include #define SLEEP_NSEC 10000 // 0.01s int main (int argc, char **argv) { char ** cmd = &argv[1]; // set timer struct timeval start, end; gettimeofday (&start, 0); // fork pid_t pid = fork (); if (pid < 0) { std::fprintf (stderr, "cannot fork.\n"); std::exit (1); } else if (pid == 0) { // child process // must not delete this execvp (cmd[0], cmd); std::fprintf (stderr, "cannot run %s\n", cmd[0]); _exit (errno == ENOENT ? 127 : 126); } // dislable signals signal (SIGINT, SIG_IGN); signal (SIGQUIT, SIG_IGN); // parent process size_t mem = 0; int status; char statm[32]; std::sprintf (&statm[0], "/proc/%d/statm", static_cast (pid)); do { FILE *reader = fopen (statm, "r"); size_t dummy (0), vm (0); std::fscanf (reader, "%ld %ld ", &dummy, &vm); // get resident (see procps) if (mem < vm) mem = vm; std::fclose (reader); if (! vm) break; } while (! usleep (SLEEP_NSEC)); mem *= getpagesize (); // stop timer if (waitpid (pid, &status, 0) == -1) std::fprintf (stderr, "error waiting for child process.\n"); if ((status & 0xff) == 0x7f) std::fprintf (stderr, "Command stopped by signal %d\n", (status >> 8) & 0xff); else if ((status & 0xff) != 0) std::fprintf (stderr, "Command terminated by signal %d\n", status & 0xff); else if ((status >> 8) & 0xff) std::fprintf (stderr, "Command exited with non-zero status %d\n", (status >> 8) & 0xff); gettimeofday (&end, 0); std::fprintf (stderr, "elapsed (real): %.3fs; RSS=%.1fM\n", end.tv_sec - start.tv_sec + (end.tv_usec - start.tv_usec) * 1e-6, static_cast (mem) / (1024.0 * 1024.0)); // enable signals signal (SIGINT, SIG_DFL); signal (SIGQUIT, SIG_DFL); return 0; }