📄 time.c
字号:
case '%': /* Literal '%'. */ putc ('%', fp); break; case 'C': /* The command that got timed. */ fprintargv (fp, command, " "); break; case 'D': /* Average unshared data size. */ fprintf (fp, "%lu", MSEC_TO_TICKS (v) == 0 ? 0 : ptok ((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS (v) + ptok ((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS (v)); break; case 'E': /* Elapsed real (wall clock) time. */ if (resp->elapsed.tv_sec >= 3600) /* One hour -> h:m:s. */ fprintf (fp, "%ldh %ldm %02lds", resp->elapsed.tv_sec / 3600, (resp->elapsed.tv_sec % 3600) / 60, resp->elapsed.tv_sec % 60); else fprintf (fp, "%ldm %ld.%02lds", /* -> m:s. */ resp->elapsed.tv_sec / 60, resp->elapsed.tv_sec % 60, resp->elapsed.tv_usec / 10000); break; case 'F': /* Major page faults. */ fprintf (fp, "%ld", resp->ru.ru_majflt); break; case 'I': /* Inputs. */ fprintf (fp, "%ld", resp->ru.ru_inblock); break; case 'K': /* Average mem usage == data+stack+text. */ fprintf (fp, "%lu", MSEC_TO_TICKS (v) == 0 ? 0 : ptok ((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS (v) + ptok ((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS (v) + ptok ((UL) resp->ru.ru_ixrss) / MSEC_TO_TICKS (v)); break; case 'M': /* Maximum resident set size. */ fprintf (fp, "%lu", ptok ((UL) resp->ru.ru_maxrss)); break; case 'O': /* Outputs. */ fprintf (fp, "%ld", resp->ru.ru_oublock); break; case 'P': /* Percent of CPU this job got. */ /* % cpu is (total cpu time)/(elapsed time). */ if (r > 0) fprintf (fp, "%lu%%", (v * 100 / r)); else fprintf (fp, "?%%"); break; case 'R': /* Minor page faults (reclaims). */ fprintf (fp, "%ld", resp->ru.ru_minflt); break; case 'S': /* System time. */ fprintf (fp, "%ld.%02ld", resp->ru.ru_stime.tv_sec, resp->ru.ru_stime.TV_MSEC / 10); break; case 'T': /* System time. */ if (resp->ru.ru_stime.tv_sec >= 3600) /* One hour -> h:m:s. */ fprintf (fp, "%ldh %ldm %02lds", resp->ru.ru_stime.tv_sec / 3600, (resp->ru.ru_stime.tv_sec % 3600) / 60, resp->ru.ru_stime.tv_sec % 60); else fprintf (fp, "%ldm %ld.%02lds", /* -> m:s. */ resp->ru.ru_stime.tv_sec / 60, resp->ru.ru_stime.tv_sec % 60, resp->ru.ru_stime.tv_sec / 10000); break; case 'U': /* User time. */ fprintf (fp, "%ld.%02ld", resp->ru.ru_utime.tv_sec, resp->ru.ru_utime.TV_MSEC / 10); break; case 'u': /* User time. */ if (resp->ru.ru_utime.tv_sec >= 3600) /* One hour -> h:m:s. */ fprintf (fp, "%ldh %ldm %02lds", resp->ru.ru_utime.tv_sec / 3600, (resp->ru.ru_utime.tv_sec % 3600) / 60, resp->ru.ru_utime.tv_sec % 60); else fprintf (fp, "%ldm %ld.%02lds", /* -> m:s. */ resp->ru.ru_utime.tv_sec / 60, resp->ru.ru_utime.tv_sec % 60, resp->ru.ru_utime.tv_sec / 10000); break; case 'W': /* Times swapped out. */ fprintf (fp, "%ld", resp->ru.ru_nswap); break; case 'X': /* Average shared text size. */ fprintf (fp, "%lu", MSEC_TO_TICKS (v) == 0 ? 0 : ptok ((UL) resp->ru.ru_ixrss) / MSEC_TO_TICKS (v)); break; case 'Z': /* Page size. */ fprintf (fp, "%d", getpagesize ()); break; case 'c': /* Involuntary context switches. */ fprintf (fp, "%ld", resp->ru.ru_nivcsw); break; case 'e': /* Elapsed real time in seconds. */ fprintf (fp, "%ld.%02ld", resp->elapsed.tv_sec, resp->elapsed.tv_usec / 10000); break; case 'k': /* Signals delivered. */ fprintf (fp, "%ld", resp->ru.ru_nsignals); break; case 'p': /* Average stack segment. */ fprintf (fp, "%lu", MSEC_TO_TICKS (v) == 0 ? 0 : ptok ((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS (v)); break; case 'r': /* Incoming socket messages received. */ fprintf (fp, "%ld", resp->ru.ru_msgrcv); break; case 's': /* Outgoing socket messages sent. */ fprintf (fp, "%ld", resp->ru.ru_msgsnd); break; case 't': /* Average resident set size. */ fprintf (fp, "%lu", MSEC_TO_TICKS (v) == 0 ? 0 : ptok ((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS (v)); break; case 'w': /* Voluntary context switches. */ fprintf (fp, "%ld", resp->ru.ru_nvcsw); break; case 'x': /* Exit status. */ fprintf (fp, "%d", WEXITSTATUS (resp->waitstatus)); break; case '\0': putc ('?', fp); return; default: putc ('?', fp); putc (*fmt, fp); } ++fmt; break; case '\\': /* Format escape. */ switch (*++fmt) { case 't': putc ('\t', fp); break; case 'n': putc ('\n', fp); break; case '\\': putc ('\\', fp); break; default: putc ('?', fp); putc ('\\', fp); putc (*fmt, fp); } ++fmt; break; default: putc (*fmt++, fp); } if (ferror (fp)) error_msg_and_die("write error"); } putc ('\n', fp); if (ferror (fp)) error_msg_and_die("write error");}/* Run command CMD and return statistics on it. Put the statistics in *RESP. */static void run_command (char *const *cmd, resource_t *resp){ pid_t pid; /* Pid of child. */ __sighandler_t interrupt_signal, quit_signal; gettimeofday (&resp->start, (struct timezone *) 0); pid = fork (); /* Run CMD as child process. */ if (pid < 0) error_msg_and_die("cannot fork"); else if (pid == 0) { /* If child. */ /* Don't cast execvp arguments; that causes errors on some systems, versus merely warnings if the cast is left off. */ execvp (cmd[0], cmd); error_msg("cannot run %s", cmd[0]); _exit (errno == ENOENT ? 127 : 126); } /* Have signals kill the child but not self (if possible). */ interrupt_signal = signal (SIGINT, SIG_IGN); quit_signal = signal (SIGQUIT, SIG_IGN); if (resuse_end (pid, resp) == 0) error_msg("error waiting for child process"); /* Re-enable signals. */ signal (SIGINT, interrupt_signal); signal (SIGQUIT, quit_signal);}extern int time_main (int argc, char **argv){ int gotone; resource_t res; const char *output_format = default_format; argc--; argv++; /* Parse any options -- don't use getopt() here so we don't * consume the args of our client application... */ while (argc > 0 && **argv == '-') { gotone = 0; while (gotone==0 && *++(*argv)) { switch (**argv) { case 'v': output_format = long_format; break; case 'p': output_format = posix_format; break; default: show_usage(); } argc--; argv++; gotone = 1; } } if (argv == NULL || *argv == NULL) show_usage(); run_command (argv, &res); summarize (stdout, output_format, argv, &res); fflush (stdout); if (WIFSTOPPED (res.waitstatus)) exit (WSTOPSIG (res.waitstatus)); else if (WIFSIGNALED (res.waitstatus)) exit (WTERMSIG (res.waitstatus)); else if (WIFEXITED (res.waitstatus)) exit (WEXITSTATUS (res.waitstatus)); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -