Scroll to navigation

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

ОШИБКИ

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

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

15 сентября 2017 г. Linux