times(2) возвращает времена процесса

ОБЗОР

#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 записывается код ошибки.

ОШИБКИ

EFAULT
Значение tms указывает за пределы адресного пространства процесса.

СООТВЕТСТВИЕ СТАНДАРТАМ

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 (т. е., около 429 миллионов) секунд до времени загрузки системы. Из-за переменчивости в разных версиях ядер (и в реализациях 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.