- •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 )
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() работает с точностью, которая обеспечивается разрешающей способностью часов.
Продолжительность приостановки может превосходить заданную из-за разрешающей способности часов, а также накладных расходов системы. Однако продолжительность приостановки не может быть меньше указанной, если только не поступил какой-либо сигнал.
