Справочное руководство Bash говорит
Использование
времени
в качестве зарезервированного слова разрешает синхронизацию встроенных команд оболочки, функций оболочки и конвейеров. Внешняя командаtime
не может отсчитывать время это легко.
Что может внешняя команда время
время?
Только простая внешняя команда? Ничего другого?
Какое правило не позволяет синхронизировать другие вещи? Правило
принадлежат оболочке (bash) или реализации внешнего
команда время
?
Кстати, я использую Ubuntu, поэтому время
от Debian.
Может ли зарезервированное слово Баша время
синхронизировать все, что может
запустить? Если нет, то что не может быть время?
Что может внешнее время
, а зарезервированное слово время
не может?
Мой ответ касается Linux.
- Какое правило не позволяет синхронизировать другие вещи?
Полагаю, он получает информацию о времени только для процессов, поскольку на самом деле использует системный вызов wait4
для получения этой информации о времени . Первый параметр wait4
- это идентификатор процесса. Поэтому / usr / bin / time
всегда вызывайте execve
, а затем ждите4.
Кстати:
execve () выполняет программу, на которую указывает имя файла. имя_файла должно быть либо двоичным исполняемым файлом, либо сценарием, начинающимся со строки вида: #! интерпретатор [optional-arg]
Итак, / usr / bin / time требует чего-то, что может быть выполнено с помощью execve
- Может ли зарезервированное время слова 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
просто вычисляет разницу и печатает ее. Таким образом, он может измерять все, что угодно, например собственные встроенные функции или дочерний процесс
- Какие вещи может измерять внешнее время, а время зарезервированного слова - нет?
Фактически, оба системных вызова 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