Я пишу демон (мой первый), и он должен просыпаться каждую секунду и проверять специальную часть оборудования. У меня есть проверка аппаратного обеспечения, но как мне заставить его спать, а затем просыпаться в определенную секунду?
Я хотел бы как-то подключиться к часам и проснуться, используя какое-то прерывание. Об опросе не может быть и речи, так как я не хочу тратить ресурсы компьютера в режиме ожидания.
В одном месте Вы говорите, что хотите опросить на конкретной секунде. В другом месте Вы говорите, что хотите опросить каждую секунду. Который является этим?
Я думаю, что самый легкий путь состоял бы в том, чтобы запланировать его в программном цикле [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]: В Вашем демоне, который является.
Посмотрите на alarm
системный вызов и SIGALRM
обработчики, а также pause
. Я понятия не имею, как это сделать в Паскале, но, вероятно, это будет похоже.
man 2 alarm
man 3 sleep
Вы можете обнаружить, что sleep
более чем достаточно для ваших нужд. Действительно, в документации говорится, что это может быть даже реализовано с использованием alarm
(хотя я верю в это не в Linux).
Хорошо, хорошо, вот решение, которое я придумал. Немного боли, но ...
Во-первых, когда я готов ждать следующую секунду, я получаю текущую миллисекунду. Это лучшее разрешение, которое я могу получить от системы.
Затем я вычитаю, что из 1000 (1000 Ms в секунду) минус текущее Ms равно числу Ms, которое мне нужно ждать.
Затем умножьте это на 1 миллион (для преобразования в наносекунды)
Затем используйте NanoSleep (бла, бла).
Это, кажется, работает.
PS, я сравнил использование ЦП (с верхом) между этим методом и тем, который просто опрашивает в ожидании следующей секунды, и версия опроса использует 98% ЦП, и это использует 0,3%. Это путь.