LINUX.ORG.RU

Чтение файла по рассписанию


0

1

Всем привет!
Народ, подскажите плиз, быть может есть на свете такая библиотека или алгоритм, который бы мог мне помочь.
Задача:
Есть файл, в котором указано в какое время читать данные из какого файла. Формат примерно такой:

12:10:05 readme1.txt
13:06:07 readme2.txt
14 readme3.txt
...
...

Нужно чтобы файл readme1.txt читался именно в 12:10:05 каждые сутки, ни секундой раньше, ни секундой позже и т.д.
Я написал уже свой демон на Си, но мне кажется это какой-то «костыль».
Я из юзерспейс постоянно проверяю не наступило ли время читать из следующего файла. Хорошо было бы сделать, что-то по технологии прерываний, если не наступило время читать из следующего файла, то процесс спит, а если наступило - то ему приходит сигнал (прерывание) от таймера или другого процесса, что пора читать данные из след. файла.

Время чтения очень критично! Можно наверно сделать связку: ядро с прерываниями от таймера - процесс в юзерспейс, но хочется чего-нибудь полегче.

Вот как это по умному сделать?

Всем заранее спасибо!


Попов, man [b]at[/b].

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

Гм... Не подумал об этом. Чёрт... Спасибо

Dennis7
() автор топика

вычисляй через сколько в секундах читать следующий файл - и sleep на это число секунд

иль делай проверку каждую минуту - и как тока времени до чтения останеться меньше минуты - делай проверку каждую секунду - иль доли секунд

помоему что sleep что usleep никогда раньше - непросывпаються - но могут проснуться позже

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

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

Да, cron не делает до секунды. А жаль. Неужто придется лезть в его исходники и что-то там править. Как это было не раз

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

Я на системное время ориентируюсь, мне все равно, какой сейчас день и год. Главное, чтобы time(NULL) % SEC_IN_DAY не было больше, чем «время_чтения_из_файла»

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

Бывает. Линуксоводы не всегда правильно говорят по-русски

Dennis7
() автор топика

> именно в 12:10:05 каждые сутки, ни секундой раньше, ни секундой позже

Вы используете ОС реального времени? Если нет, то подумайте о смене алгоритма, ибо кривой костыль, который не факт что всегда будет работать.

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

и что что системное время ?
а причем день и год ?

если нужно обеспечить секундное - доли секундное срабатывание - то имхо нужно избегать-противодействовать любым влияниям на оценку времени в программе

захочет юзер - иль система автоматом - полезет часы синхронизировать - и то на что полагалось программа окажется неверным

если бы была задача обеспечить точную секунду в секунду чтение - то тут не раз в секунду проверять - раз 10-100 раз в секунду проверят текущее время стоило бы

весь вопрос же - в том - насколько точно нужно и сколько ресурсов потратить на это :)

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

даже реальтаймовая система - не обеспечит нужную точность - если железо подведет - просто напросто винт войдет в ступор на секунду - и все уже нета точность

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

Real time clock вещь конечно хорошая. Но вот как с минимальными системнымными затратрами, таких как время и память, сделать программу, чтобы в нужный момент (заданный файлом) она читала данные из файла, заданного в этом же файле. Блин каламбур какой-то получился. Но вот такая задача. А вообще libevent мне очень по душе

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

100 раз в секунду проверять? Не, мне кажется это не есть гуд

Dennis7
() автор топика

Какая то у вас задача странная. И что будет, если прочитать раньше. И вобще, чтение файла это процесс, есть время начала, есть время окончания. Готового решения, ИМХО, нет, уж больно задача странная.

Так, можно написать программу (наверное, лучше на Си), и она будет работать, но «провалы» могут случаться. Наверное, лучше ставить этой программе приоритет реального времени, «спать» с помошью nanosleep() или setitimer(), узнавать время через gettimeofday(). Может просыпаться чуть пораньше и там непрерывно проверять текущее время.

А ещё есть перевод летнее/зимнее время. Или у вас время чтения задано по гринвичу?

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

cron работает точно также
и у него - конфиг также могет быть изменен - и он его подхватит

правда в кроне - минутна интервалы - но крон просто анализирует изменился ли файл конфига за время с прошлого его чтения- если изменился он его перечитывает

и делает он это тогда когда действительно принимает решение- то есть раз в минуту


ничего менее ресурсоёмкое чем написанная программа тут не придумаешь
и вот в ней - и делайте ту величину ресурсоемкости какой и нужен

ну если вот важно срабатывание точно в секунду
то можно юзать usleep и точностью миллисекундной выставлять таймаут

тогда программа проснется - через от силы несколько миллисекунд после нужной секунды

ну и проверять изменился ли файл конфига или произошел скачек времени - раз в 1-60 секунд

ябы так сделал

ae1234 ★★
()

> Можно наверно сделать связку: ядро с прерываниями от таймера - процесс в юзерспейс, но хочется чего-нибудь полегче.

Зачем тебе ядро? Пиши прямо под железо.

Отсортируй расписание и по очереди дёргай timer_settime с флагом TIMER_ABSTIME для таймера CLOCK_REALTIME. Точность настройки фантастическая, а там уж как железо и ось осилят.

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

ну и пусть cron запускает в 12:10:00 костыль, который будет ждать нужную секунду :)

power
()

Всем большое спасибо

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