Что могут делать внешняя команда `time` и зарезервированное слово` time` time?

Справочное руководство Bash говорит

Использование времени в качестве зарезервированного слова разрешает синхронизацию встроенных команд оболочки, функций оболочки и конвейеров. Внешняя команда time не может отсчитывать время это легко.

  1. Что может внешняя команда время время?

    Только простая внешняя команда? Ничего другого?

    Какое правило не позволяет синхронизировать другие вещи? Правило принадлежат оболочке (bash) или реализации внешнего команда время ?

    Кстати, я использую Ubuntu, поэтому время от Debian.

  2. Может ли зарезервированное слово Баша время синхронизировать все, что может запустить? Если нет, то что не может быть время?

  3. Что может внешнее время , а зарезервированное слово время не может?

0
16.03.2016, 23:31
1 ответ

Мой ответ касается Linux.

  1. Какое правило не позволяет синхронизировать другие вещи?

Полагаю, он получает информацию о времени только для процессов, поскольку на самом деле использует системный вызов wait4 для получения этой информации о времени . Первый параметр wait4 - это идентификатор процесса. Поэтому / usr / bin / time всегда вызывайте execve , а затем ждите4.

Кстати:

execve () выполняет программу, на которую указывает имя файла. имя_файла должно быть либо двоичным исполняемым файлом, либо сценарием, начинающимся со строки вида: #! интерпретатор [optional-arg]

Итак, / usr / bin / time требует чего-то, что может быть выполнено с помощью execve

  1. Может ли зарезервированное время слова Bash отсчитывать время всех вещей, которые могут выполняться?

Я думаю, да. Он реализован в виде двух групп вызовов:

10:06:03 getrusage(RUSAGE_SELF, {ru_utime={0, 152976}, ru_stime={0, 465929}, ru_maxrss=4052, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=6214, ru_majflt=1, ru_nswap=0, ru_inblock=368, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=6349, ru_nivcsw=12}) = 0
10:06:03 getrusage(RUSAGE_CHILDREN, {ru_utime={2, 259656}, ru_stime={1, 888712}, ru_maxrss=21176, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=64297, ru_majflt=4, ru_nswap=0, ru_inblock=272, ru_oublock=368, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=56077, ru_nivcsw=386}) = 0

запустить команду или встроенную

10:06:04 getrusage(RUSAGE_SELF, {ru_utime={0, 152976}, ru_stime={0, 476927}, ru_maxrss=4052, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=6243, ru_majflt=1, ru_nswap=0, ru_inblock=368, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=6399, ru_nivcsw=13}) = 0
10:06:04 getrusage(RUSAGE_CHILDREN, {ru_utime={2, 271654}, ru_stime={1, 903710}, ru_maxrss=21176, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=64514, ru_majflt=4, ru_nswap=0, ru_inblock=272, ru_oublock=368, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=56079, ru_nivcsw=406}) = 0

Так что я думаю bash просто вычисляет разницу и печатает ее. Таким образом, он может измерять все, что угодно, например собственные встроенные функции или дочерний процесс

  1. Какие вещи может измерять внешнее время, а время зарезервированного слова - нет?

Фактически, оба системных вызова getrusage и wait4 получить из ядра использование struct rusage . Однако bash time печатает ограниченное количество полей из этой структуры. Это от человек 1 раз :

Примечание: некоторые оболочки (например, bash (1)) имеют встроенную команду времени, которая обеспечивает меньшую функциональность, чем команда, описанная здесь.

$/usr/bin/time -v  seq 10000
    Command being timed: "seq 10000"
    User time (seconds): 0.01
    System time (seconds): 0.01
    Percent of CPU this job got: 24%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.12
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2640
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 199
    Voluntary context switches: 8
    Involuntary context switches: 24
    Swaps: 0
    File system inputs: 0
    File system outputs: 8
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
2
28.01.2020, 02:35

Теги

Похожие вопросы