TIMES(2) | Руководство программиста Linux | TIMES(2) |
times - возвращает времена процесса
#include <sys/times.h>
clock_t times(struct tms *buf);
Вызов times() сохраняет текущие времена процесса в struct tms, на которую указывает buf. Определение struct tms содержится в <sys/times.h>:
struct tms { clock_t tms_utime; /* пользовательское время */ clock_t tms_stime; /* системное время */ clock_t tms_cutime; /* пользовательское время потомков */ clock_t tms_cstime; /* системное время потомков */ };
В поле tms_utime содержится время ЦП, потраченное для выполнения инструкций вызвавшего процесса. В поле tms_stime содержится время ЦП, потраченное в ядре для выполнения задач вызвавшего процесса.
В поле tms_cutime содержится сумма значений tms_utime и tms_cutime всех ожидающих завершения потомков. В поле tms_cstime содержится сумма значений tms_stime и tms_cstime всех ожидающих завершения потомков.
Времена завершившихся потомков (и их потомков) добавляются в момент когда wait(2) или waitpid(2) возвращают их ID процесса. При этом, времена внуков, которых потомки не ждали, никогда не добавляются.
Все времена считаются в тиках часов.
Вызов times() возвращает количество тиков часов, которое прошло с момента произвольной точки в прошлом. Возвращаемое значение может переполнить максимальную величину типа clock_t. При ошибке возвращается (clock_t) -1, а в errno записывается код ошибки.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.
Количество тиков часов в секунду можно получить с помощью:
sysconf(_SC_CLK_TCK);
В POSIX.1-1996 символ CLK_TCK (определённый в <time.h>) упомянут как устаревающий. В настоящее время он точно устарел.
В ядрах Linux до версии 2.6.9, если обработчик SIGCHLD равен SIG_IGN, то времена завершившихся потомков автоматически включаются в поля tms_cstime и tms_cutime, хотя в POSIX.1-2001 сказано, что это должно происходить только, если вызвавший процесс вызывал wait(2) для своих потомков. Это несоответствие устранено в Linux 2.6.9 и более новых.
В Linux значение аргумента buf может быть равно NULL. В этом случае times() просто возвращает результат функции. Однако в POSIX не описано такое поведение, и для большинства других реализаций UNIX требуется не равное NULL значение buf.
Заметим, что clock(3) также возвращает значение типа clock_t, но это значение измеряется в единицах CLOCKS_PER_SEC, а не в тиках часов как у times().
«Произвольная точка в прошлом», от которой отсчитывается возвращаемое значение times(), измеряется в разных в версиях ядра Linux по-разному. В Linux 2.4 и старее этой точкой является момент загрузки системы. Начиная с Linux 2.6 эта точка равна (2^32/HZ) - 300 секунд до времени загрузки системы. Из-за переменчивости в разных версиях ядер (и в реализациях UNIX) и с учётом того, что возвращаемое значение может выйти за пределы диапазона clock_t, в переносимом приложении не следует использовать это значение. Для подсчёта прошедшего времени используйте clock_gettime(2).
В SVr1-3 результат имеет тип long и члены структуры имеют тип time_t, хотя они хранят тики часов, а не секунды начиная с Эпохи. В V7 используется long для членов структуры, так как тип time_t ещё не существовал.
Ограничение Linux в соглашениях системного вызова на некоторых архитектурах (в частности i386) приводит к тому, что в Linux 2.6 есть маленький временной интервал (41 секунда), в котором сразу после загрузки times() может вернуть -1, ложно указывая на существование ошибки. Такая же проблема может возникнуть, когда возвращаемое значение становится больше максимального значения типа clock_t.
time(1), getrusage(2), wait(2), clock(3), sysconf(3), time(7)
2017-09-15 | Linux |