LINUX.ORG.RU

Помогите с Time::HiRes - как сделать вызов функции по сигналам таймера? PERL

 ,


0

1

Добрый день!

Подскажите, пожалуйста, как с помощью Time::HiRes сделать вызов функции по таймеру? Т.е. интересует небольшой пример кода на PERL, с описанием параметров этого модуля. Функция должна вызываться каждый час, ровно в 13:00, 14:00, 15:00 и т.д. Маленький такой демон нужен.

P.S. Хотя бы расскажите параметры, потому что гугл примеров не дает на русском, а на английском как-то не очень понятно....

P.P.S. Cron не предлагать по идейным соображениям.



Последнее исправление: OlegOleg1980 (всего исправлений: 1)

По идейным соображениям вам нужно учить английский.

Time::HiRes не делает callback заданной функции в заданное время. Сначала решите, какую модель вы ходите использовать sleep или alarm. Все функции, которые предоставляет Time::HiRes фактически обёртка над соответствующими системыми вызовами, допустим http://www.opennet.ru/man.shtml?topic=ualarm&category=3&russian=0

mky ★★★★★
()
Ответ на: комментарий от mky

Согласен, учить нужно. У меня технический слабоват. Увы..

По теме. Может все таки примерчик накидаете и пару комментов - что куда зачем. Ведь вопрос то простой, но я раньше с ним не сталкивался. Спасибо.

OlegOleg1980
() автор топика
Ответ на: комментарий от OlegOleg1980

Тут скорее вопрос, как вы вобще раньше писали что-либо на perl'е...

Готовый код я писать не буду, это ваша задача. Вот, как бы что касаестся временных функций для вашей задачи:

#Здесь код, который установит обработку сигнала SIGALARM

use Time::HiRes qw(gettimeofday setitimer ITIMER_REAL);

# текущее системное время в unix-time --
# секунды и микросекунды с 1-го января 1970
($s, $usec) = gettimeofday();

$slp_sec = ... # Здесь код, который вычисляет, через сколько
# секунд будет ближайший нужный момент времени, допустим 13:00

# Через $slp_sec сработает таймер и придёт сигнал SIGALRM
setitimer(ITIMER_REAL, $slp_sec, 3600);

# Здесь вызываем pause(), ждём когда придёт сигнал

mky ★★★★★
()

Тебе нужна книга «Perl. Сборник рецептов для прфессионалов.» Кристиансен, Торкингтон. 16 глава. Есть на русском.

TDrive ★★★★★
()
Ответ на: комментарий от mky

спасибо!

на perle вообще не писал раньше :) поэтому и вопросы...

собственно, нужен был этот участок

# Через $slp_sec сработает таймер и придёт сигнал SIGALRM

setitimer(ITIMER_REAL, $slp_sec, 3600);

и описание параметров

не до конца понятен параметр в данном коде «ITIMER_REAL» их 4, какой из них правильнее использовать?

P.S. запустил демончик с кодом - работает - правда вместо gettimeofday() использовал просто time() для вычислений, но разница как я понимаю только в мсек

OlegOleg1980
() автор топика
Ответ на: комментарий от OlegOleg1980

их 4

В Линуксе их три: http://ccfit.nsu.ru/~deviv/courses/unix/unix/ng5335e.html , http://www.rulit.net/books/linux-programmirovanie-v-primerah-read-303219-179.... . Раз нужно с системными часами, а не со временем выполнения программы, то ITIMER_REAL.

Если это реально используемый демон для какой-то задачи, а не лабораторная работа, то, возможно, что алгоритм нужно поменять, так как таймеры работают на число тиков системных часов, а не на их показания. Если в системе время изменяется «скачком», допустим, root установил новое время командой date или nptdate, то таймер сработает не в ожидаемый момент.

В этом случае нужно использовать clock_nanosleep() с флагом TIMER_ABSTIME. clock_nanosleep() будет преостонавливать выполнение процесса до заданного unix-времени на системных часах или до получения сигнала. Если предусматиривать, что часы могут быть переведеные не только вперёд, но и назад (допустим на год), то тогда нужно использоват и clock_nanosleep() и setittimer для преодической проверки текущего времени и пресчёта в случае перевода системных часов.

 use Time::HiRes qw(gettimeofday clock_nanosleep TIMER_ABSTIME );
# текущее системное время в unix-time --
# секунды и микросекунды с 1-го января 1970
 ($s, $usec) = gettimeofday();

 $s_next = ... # Здесь код, который вычисляет, какое unix-time
# будет в ближайший нужный момент времени

 clock_nanosleep(CLOCK_REALTIME, $s_next, TIMER_ABSTIME);

# Здесь код проверки, что текущее время близко к ожидаемому
# и выполнение нужных действий. 

mky ★★★★★
()
Ответ на: комментарий от mky

Староват я для написания лабораторных то:))) Так что область применения вполне реальная.

Для выполняемых задач (а именно кой-какие операции с БД) перескоки времени не критичны, важна периодичность и стабильность, а если случаются GEPы, то они не влияют на механизм работы, т.к. они не накапливаются.

Но все равно, спасибо за столь подробные разъяснения, в манах я не увидел этого.

OlegOleg1980
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.