Я пишу системный монитор для Linux и хочу включить некоторые функции сторожевого таймера. В ядре вы можете настроить сторожевой таймер на продолжение, даже если /dev/watchdog закрыт. Другими словами, если мой демон нормально завершает работу и закрывает /dev/watchdog, система будет перезагружаться через 59 секунд. Это может или не может быть желательным поведением для пользователя.
Мне нужно, чтобы мой демон узнал об этом параметре, потому что это повлияет на то, как я обрабатываю SIGINT. Если настройка включена, моему демону необходимо (желательно) начать упорядоченное завершение при выходе или (по крайней мере) предупредить пользователя о том, что система скоро перезагрузится.
Кто-нибудь знает о способе получения этого параметра из пользовательского пространства? Я ничего не вижу в sysconf(), чтобы получить значение. Аналогично, мне нужно узнать, разрешено ли сторожевому таймеру программного обеспечения.
Edit:
Linux предоставляет очень простой интерфейс сторожевого таймера. Процесс может открыть /dev/watchdog, как только устройство будет открыто, ядро начнет отсчет 60 секунд до перезагрузки, если в этот файл не будут записаны некоторые данные, и в этом случае часы будут повторно установлены.
В зависимости от того, как настроено ядро, закрытие этого файла может или не может остановить обратный отсчет. Из документации:
Наблюдатель может быть остановлен без вызывая перезагрузку, если устройство /dev/ сторожевой таймер закрыт правильно, если ваше ядро не скомпилировано с опция CONFIG_WATCHDOG_NOWAYOUT включен.
Мне нужно узнать, был ли установлен CONFIG_WATCHDOG_NOWAYOUT из демонстрантов пользовательского пространства, чтобы я мог по-разному обрабатывать выключение этого демона. Другими словами, если эта настройка высока, просто:
# /etc/init.d/mydaemon stop
... перезагрузит систему за 59 секунд, потому что ничего больше не записывает в /dev/watchdog. Таким образом, если его набор высокий, мой обработчик для SIGINT должен делать дополнительные вещи (т.е. Предупреждать пользователя как минимум).
Я не могу найти способ получить этот параметр из пользовательского пространства:( Любая помощь приветствуется.