ОБЗОР
#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).