Пробуждение демона через часы

Я пишу демон (мой первый), и он должен просыпаться каждую секунду и проверять специальную часть оборудования. У меня есть проверка аппаратного обеспечения, но как мне заставить его спать, а затем просыпаться в определенную секунду?

Я хотел бы как-то подключиться к часам и проснуться, используя какое-то прерывание. Об опросе не может быть и речи, так как я не хочу тратить ресурсы компьютера в режиме ожидания.

  • Pascal
  • Ubuntu Server 10.10
  • Нет ООП
0
задан 22 December 2011 в 12:36

3 ответа

В одном месте Вы говорите, что хотите опросить на конкретной секунде. В другом месте Вы говорите, что хотите опросить каждую секунду. Который является этим?

Я думаю, что самый легкий путь состоял бы в том, чтобы запланировать его в программном цикле [1] самом. Я не знаю Паскаля, но конечно он имеет своего рода функцию сна.

Вот некоторый псевдокод, чтобы дать Вам идею:

while(true) {
    check_hardware()
    sleep(1) //unit is seconds
}

Если Вы хотите только работать на некоторой определенной секунде, просто добавьте проверку на второе:

while(true) {
    if(get_time_as_seconds() in allowable_seconds()) {
        check_hardware()
    }
    sleep(1)
}

[1]: В Вашем демоне, который является.

0
ответ дан 22 December 2011 в 12:36

Посмотрите на alarm системный вызов и SIGALRM обработчики, а также pause. Я понятия не имею, как это сделать в Паскале, но, вероятно, это будет похоже.

man 2 alarm
man 3 sleep

Вы можете обнаружить, что sleep более чем достаточно для ваших нужд. Действительно, в документации говорится, что это может быть даже реализовано с использованием alarm (хотя я верю в это не в Linux).

1110 Обратите внимание, что все эти вещи не гарантируют, когда вы просыпаетесь. Время указано приблизительно. Тревога не будет доставлена ​​ до указанного времени, но может быть доставлена ​​с небольшим опозданием . Сон имеет аналогичную проблему, но может также вернуться рано, если процесс получает другой сигнал.

0
ответ дан 22 December 2011 в 12:36

Хорошо, хорошо, вот решение, которое я придумал. Немного боли, но ...

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

Затем я вычитаю, что из 1000 (1000 Ms в секунду) минус текущее Ms равно числу Ms, которое мне нужно ждать.

Затем умножьте это на 1 миллион (для преобразования в наносекунды)

Затем используйте NanoSleep (бла, бла).

Это, кажется, работает.

PS, я сравнил использование ЦП (с верхом) между этим методом и тем, который просто опрашивает в ожидании следующей секунды, и версия опроса использует 98% ЦП, и это использует 0,3%. Это путь.

0
ответ дан 22 December 2011 в 12:36

Другие вопросы по тегам:

Похожие вопросы: