Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / часы_таймеры_потоки.DOC
Скачиваний:
33
Добавлен:
01.05.2014
Размер:
351.23 Кб
Скачать

Timer_create

Синтаксис

#include <signal.h>

#include <time.h>

Int timer_create(

clockid_t clock_id,

struct sigevent *evp,

timer_t *timerid);

Аргументы

clock_id идентификатор часов, с которыми будет связан создаваемый таймер

evp указатель на структуру sigevent, описывающую способ оповещения о срабатывании таймера

timerid указатель на переменную, в которую будет помещен идентификатор созданного таймера

Описание

Функция timer_create() создает таймер, используя часы clock_id для отсчета времени. В случае успешного выполнения функции в переменную типа timer_t, на которую указывает аргумент timerid будет помещен идентификатор созданного таймера. В дальнейшем этот идентификатор может быть использован при вызове функций timer_settime(), timer_gettime(), timer_getoverrun() и timer_delete().

Аргумент evp, если он не равен NULL, должен указывать на структуру sigevent, описывающую способ оповещения о срабатывании таймера. Эта структура должна быть заранее создана прикладной программой.

Timer_settime

#include <time.h>

Int timer_settime(

timer_t timerid,

Int flags,

const struct itimerspec *value,

struct itimerspec *ovalue);

Аргументы

timerid

идентификатор таймера;

flags

флаги;

value

устанавливаемое значение таймера;

ovalue

старое значение таймера.

Описание

Функция timer_settime() устанавливает время до следующего срабатывания таймера, заданного аргументом timerid. Устанавливаемое значение находится в структуре itimerspec, на которое указывает аргумент value. Эта структура содержит следующие элементы.

srtuct timespec it_interval периодичность запуска

struct timespec it_value значение таймера

Если значения времени, указанные элементами it_interval или it_value не кратны разрешающей способности часов, связанных с таймером, то они будут округлены до большего значения, кратного разрешающей способности.

Если флаг TIMER_ABSTIME в аргументе flags не установлен, то время до следующего срабатывания таймера равно интервалу, заданному в поле it_value структуры, указанной аргументом value. Если флаг TIMER_ABSTIME в аргументе flags установлен, то время до следующего срабатывания таймера равно разности между абсолютным временем, заданным в поле it_value структуры, указанной аргументом it_value, и текущим показанием часов, связанных с таймером. То есть таймер сработает, когда часы покажут время, заданное в поле it_value структуры value. Если указанное время уже истекло, то функция считается выполненной успешно, и будет выдано извещение об истечении времени.

Если при вызове функции timer_settime() таймер уже включен, то время срабатывания таймера будет переустановлено, т.е. заменено значением, указанным в value.

Если значение it_value в структуре, на которую указывает аргумент value не равно 0, то функция timer_settime() запустит таймер. В противном случае таймер не будет включен или будет остановлен, если он был включен ранее.

Если значение it_interval не равно нулю, то после срабатывания таймер будет установлен и запущен заново со значением, равным элементу it_interval структуры, на которую указывает аргумент value. Таким образом, таймер будет периодическим (многоразовым).

Если аргумент ovalue не равен NULL, то в структуру, на которую он указывает, будет записано предыдущее значение времени до срабатывания таймера (даже если при установке таймера был установлен флаг TIMER_ABSTIME) или 0, если таймер не был запущен, а также предыдущее значение периодичности запуска таймера. Эти значения зависят от разрешающей способности таймера и равны в точности тем значениям, которые были бы возвращены при вызове timer_gettime() в этот момент времени.

Если для оповещения о срабатывании таймера используется сигнал, то при повторном срабатывании таймера сигнал не будет послан, если предыдущий сигнал не был обработан. С помощью функции timer_getoverrun() можно получить количество срабатываний таймера, произошедших между моментом генерирования сигнала (постановки в очередь) и моментом доставки или приема.

Выключение или переустановка таймера не влияет на ранее выданные сигналы о срабатывании таймера, даже если они еще не были обработаны.

posix_timer_abs.C

#include <iostream.h>

#include <stdio.h>

#include <unistd.h>

#include <signal.h>

#include <time.h>

void callme( int signo, siginfo_t* evp, void* ucontext )

{

time_t tim = time(0);

cerr << "callme: " << evp->si_value.sival_int

<< ", signo: " << signo << ", " << ctime(&tim);

}

int main()

{

struct sigaction sigv;

struct sigevent sigx;

struct itimerspec val;

struct tm do_time;

timer_t t_id;

sigemptyset( &sigv.sa_mask );

sigv.sa_flags = SA_SIGINFO;

sigv.sa_sigaction = callme;

if (sigaction( SIGUSR1, &sigv, 0) == -1)

{

perror("sigaction");

return 1;

}

sigx.sigev_notify = SIGEV_SIGNAL;

sigx.sigev_signo = SIGUSR1;

sigx.sigev_value.sival_int = 12;

if ( timer_create( CLOCK_REALTIME, &sigx, &t_id ) == -1)

{

perror("timer_create");

return 1;

}

/* Set timer to go off at April 20, 1996, 10:27am */

do_time.tm_hour = 10;

do_time.tm_min = 27;

do_time.tm_sec = 30;

do_time.tm_mon = 3;

do_time.tm_year = 96;

do_time.tm_mday = 20;

val.it_value.tv_sec = mktime( &do_time );

val.it_value.tv_nsec = 0;

val.it_interval.tv_sec = 15;

val.it_interval.tv_nsec = 0;

cerr << "timer will go off at: " << ctime(&val.it_value.tv_sec);

if (timer_settime( t_id, TIMER_ABSTIME, &val, 0 ) == -1 )

{

perror("timer_settime");

return 2;

}

/* do something then wait for the timer to expire twice*/

for (int i=0; i < 2; i++ )

pause();

if (timer_delete( t_id ) ==-1)

{

perror( "timer_delete" );

return 3;

}

return 0;

}

Задержка выполнения

Функции nanosleep() и sleep() позволяют приостановить текущий процесс (поток управления) на указанный интервал времени.

Функция nanosleep() является более точной, чем функция sleep(). Функция sleep() позволяет указывать время только с точностью до секунды, тогда как nanosleep() работает с точностью, которая обеспечивается разрешающей способностью часов.

Продолжительность приостановки может превосходить заданную из-за разрешающей способности часов, а также накладных расходов системы. Однако продолжительность приостановки не может быть меньше указанной, если только не поступил какой-либо сигнал.

Соседние файлы в папке Материалы