- •Clock_gettime
- •Int main(int argc, char **argv)
- •Timer_create
- •Int timer_create(
- •Timer_settime
- •Int timer_settime(
- •Int flags,
- •Многопотоковое программирование
- •13.1. Структура и методика использования потоков выполнения
- •13.2. Потоки и облегченные процессы
- •13.3. Api потоков выполнения фирмы Sun Microsystems
- •Void* printmsg (void* msg )
стр.
Часы и таймеры
Часы
time()
clock_gettime()
clock_settime()
clock_getres()
Для хранения интервала времени, выраженного в секундах, используются переменные типа time_t.
Функция time() позволяет получить значение часов с точностью до 1 секунды. Эта функция позволяет опрашивать только системные часы.
time
Синтаксис
#include <time.h>
time_t time(time_t *tloc);
Для более точного измерения времени используется структура timespec, которая содержит следующие элементы:
|
Тип элемента |
Идентификатор элемента |
Описание |
|
time_t |
tv_sec |
секунды |
|
long |
tv_nsec |
наносекунды |
Допустимым значением элемента tv_nsec является величина, большая или равная нулю и меньшая количества наносекунд в 1 секунде (1000 млн.). Временной интервал, описываемый данной структурой, составляет
(tv_sec * 1,000,000,000 + tv_nsec) наносекунд.
Оба типа данных (time_t и timespec) могут использоваться для хранения календарного времени. В этом случае хранящиеся в них данные интерпретируются как время, прошедшее с 0 часов 1 января 1970 года.
Структура tm позволяет хранить дату и время в общепринятом виде. Она содержит следующие элементы:
|
Тип элемента |
Идентификатор элемента |
Описание |
|
int |
tm_sec |
секунды |
|
int |
tm_min |
минуты |
|
int |
tm_hour |
часы (с 0) |
|
int |
tm_mday |
день месяца (с 1) |
|
int |
tm_mon |
месяц (с 0) |
|
int |
tm_year |
год с 1900 |
|
int |
tm_wday |
день недели (воскресенье - 0) |
|
int |
tm_yday |
день в году (с 0) |
|
int |
tm_isdst |
флаг "летнее время" |
Система всегда содержит, по крайней мере, одни часы с идентификатором CLOCK_REALTIME (системные часы). Значение этих часов интерпретируется как календарное время, то есть время (в секундах и наносекундах), истекшее с 0 часов 1 января 1970 года.
Функция clock_settime() позволяет установить показания часов, функция clock_gettime() - опросить показания часов, а clock_getres() - узнать разрешающую способность часов. Все три функции работают с высокой точностью, так как используют структуру timespec. Отметим, однако, результаты измерения времени не могут быть точнее, чем разрешающая способность часов.
Clock_gettime
Синтаксис
#include <time.h>
int clock_gettime(
clockid_t clock_id,
struct timespec *tp);
Аргументы
clock_id |
идентификатор часов; |
tp |
указатель на структуру timespec, в которую записываются показания часов. |
Описание
Функция clock_gettime() записывает текущие показания часов clock_id в структуру timespec, на которую указывает аргумент tp.
clock_settime
Синтаксис
#include <time.h>
int clock_settime(
clockid_t clock_id,
const struct timespec *tp);
Описание
Функция clock_settime() устанавливает часы, указанные аргументом clock_id, в соответствии со значением, определенным аргументом tp. Если указанное аргументом tp значение времени не кратно разрешающей способности указанных часов, то оно уменьшается до наибольшего кратного значения.
clock_getres
Синтаксис
#include <time.h>
int clock_getres(
clockid_t clock_id,
struct timespec *res);
Описание
Функция clock_getres() позволяет выяснить разрешающая способность часов. Если значение аргумента res не равно NULL, то разрешающая способность указанных часов будет записана в структуру timespec, на которую указывает аргумент res.
Функции localtime() и localtime_r() позволяют получить локальное время, а функции gmtime() и gmtime_r() - мировое время. Все четыре функции формируют результат в структуре tm, а в качестве исходных данных получают календарное время в секундах, то есть количество секунд, истекших с 0 часов 1 января 1970 года, UTC. Таким образом, исходные данные для этих функций можно получить с помощью функции time().
Функция mktime() преобразует локальное время, записанное в структуре tm, в календарное время (количество секунд, истекшее с 0 часов 1 января 1970 года, UTC).
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <sys/time.h>
struct timeval tv1,tv2;
Int main(int argc, char **argv)
{
int i, ntimes=100000;
float d1;
gettimeofday(&tv1, NULL);
for(i=0;i<ntimes;i++)
d1=sin(i)
;
gettimeofday(&tv2, NULL);
tv2.tv_usec += 1000000*(tv2.tv_sec-tv1.tv_sec);
d1 = (float)(tv2.tv_usec - tv1.tv_usec)/1000000.;
printf("\ndelta sec %f \n", d1);
}
Таймеры
nanosleep()
sleep()
alarm().
timer_create()
timer_settime()
timer_gettime()
timer_getoverrun()
timer_delete()
Для посылки сигнала в определенный момент в будущем можно использовать функцию alarm(). Эта функция предписывает системе сгенерировать сигнал SIGALRM через указанный интервал времени (в секундах).
Программные таймеры позволяют запланировать выполнение какой-либо деятельности в определенный момент времени в будущем. Для создания таймера используется функция timer_create(). Одним из аргументов этой функции является структура sigevent, которая определяет вид оповещения о срабатывании таймера (например, посылка сигнала или выполнение указанной функции).
Функция timer_create() только создает таймер, но не запускает его. Установка и запуск таймера производится функцией timer_settime(). Функция timer_settime() определяет время первого срабатывания таймера, а также период срабатывания (если требуется периодическое срабатывание таймера). Для первого срабатывания таймера можно указать либо абсолютное время срабатывания (то есть таймер сработает, когда часы покажут указанное время), либо относительное (интервал времени, через который должен сработать таймер).
Если указан период срабатывания таймера, то после каждого срабатывания таймера он будет заново установлен и запущен со значением, равным указанному периоду. Функция timer_settime() также позволяет остановить (сбросить) таймер.
Функция timer_gettime() позволяет опросить время, оставшееся до срабатывания таймера, а также период срабатывания.
Если для оповещения о срабатывании таймера используется сигнал, то при повторном срабатывании таймера сигнал не будет послан, если предыдущий сигнал не был обработан. С помощью функции timer_getoverrun() можно получить количество срабатываний таймера, произошедших между моментом генерирования сигнала (постановки в очередь) и моментом доставки или приема.
Когда потребность в таймере отпадет, его можно удалить функцией timer_delete().
Сброс и переустановка таймера не влияет на ранее выданные сигналы о срабатывании таймера, даже если они еще не были обработаны.