clock_gettime()

Получить текущее значение часов

Прототип:

#include <time.h>
int clock_gettime( clockid_t clock_id,
struct timespec *tp );

Аргументы:

clock_id
Идентификатор (ID) часов, который может принимать значения:
CLOCK_REALTIME
стандартные часы, определенные в POSIX. Основанные на этих часах таймеры, разбудят процессор, если он находится в режиме энергосбережения.
CLOCK_SOFTTIME
эти часы активны, когда процессор не находится в режиме энергосбережения. Например, приложение, использующее таймер на базе CLOCK_SOFTTIME для сна, не "разбудит" процессор, когда приложение должно проснуться. Это позволит процессору перейти в режим энергосбережения. Когда процессор не находится в режиме энергосбережения таймеры типа CLOCK_SOFTTIME аналогичны типу CLOCK_REALTIME.
CLOCK_MONOTONIC
эти часы всегда увеличиваются с постоянной скоростью и не могут быть отрегулированы.
CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, а также идентификаторы (clock ID), возвращаемые функциями clock_getcpuclockid(), pthread_getcpuclockid() или ClockId()
позволяют получить ориентировочную информация о времени, в течение которого процесс или поток находился в акивном состоянии. Идентификаторы CLOCK_PROCESS_CPUTIME_ID и CLOCK_THREAD_CPUTIME_ID являются специализированными значениями для получения информации о времени активности вызывающего процесса или потока соответственно.
tp
Указатель на структуру struct timespec, в которой функция clock_gettime() сохранит время, имеющей следующие поля:

Библиотека:

libc

Описание:

Функция clock_gettime() получает текущее значение часов типа clock_id и записывает его в структуру tp.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EFAULT
Возникла ошибка, когда ядро попыталось получить доступ к буферам.
EINVAL
Некорректный идентификатор clock_id.
ESRCH
Отсутствует ассоциированный с запросом процесс.

Примеры:

/*
* Эта программа вычисляет время, затраченное на
* выполнение программы, определенной в первом аргументе.
* Время выводится в секундах в стандартный поток вывода.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define BILLION 1000000000L;
int main( int argc, char** argv )
{
struct timespec start, stop;
double accum;
if ( clock_gettime( CLOCK_REALTIME, &start ) == -1 )
{
perror( "clock gettime" );
return (EXIT_FAILURE);
}
system( argv[1] );
if ( clock_gettime( CLOCK_REALTIME, &stop ) == -1 )
{
perror( "clock gettime" );
return (EXIT_FAILURE);
}
accum = ( stop.tv_sec - start.tv_sec ) +
(double)( stop.tv_nsec - start.tv_nsec ) / (double)BILLION;
printf( "%lf\n", accum );
return (EXIT_SUCCESS);
}

Классификация:

POSIX 1003.1 Timers

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

clock_getres(), clock_settime(), errno, struct timespec




Предыдущий раздел: Описание API системной библиотеки