На моем устройстве работает приложение C++, которое представляет собой немного модифицированную версию Raspberry PI. Приложение считывает данные из последовательного порта, и мне нужно, чтобы устройство перезагрузилось после получения определенных данных. Мне было интересно интегрировать эту функцию со сторожевым таймером, но я понятия не имею, как это сделать. Может быть, есть возможность отправить какой-нибудь сигнал из моего приложения на сторожевой таймер, чтобы сказать, что пора перезагрузиться?
P.S. Приложение запускается как служба systemd.
@ Марко, конечно, вызов перезагрузки был первым, о чем я подумал. Но для меня watchdog звучит гораздо правильнее. не так ли?
@oodessit sounds не является техническим аргументом. Марко объяснил, как используются сторожевые таймеры, и указал, что ваш случай не соответствует этому сценарию.





Почему бы вам сделать это таким образом? Причина, по которой используются сторожевые таймеры, — это именно то, что описал Марко. Если система не отвечает, срабатывает сторожевой таймер. Обычно это необходимо, потому что устройства, которые, скажем, выключены, больше не отправляют что-нибудь, поэтому вам нужен какой-то триггер, чтобы ваша система знала, что она должна перезагрузиться. Здесь вы уже получаете свой триггер от входящего сигнала, поэтому сторожевой таймер избыточен. Просто перезагрузитесь после того, как вы получили свои данные.
Watchdog отлично подходит, если вы хотите, чтобы ваше устройство перезагружалось автономно, когда ваше программное обеспечение блокируется или становится недоступным. Если это то, чего вы хотите достичь, сторожевой таймер — правильный выбор.
Вызов
std::system("sudo reboot");
Это правильный ответ на проблему. Однако я бы не ожидал, что sudo reboot будет работать в большинстве случаев установки, поскольку обычно требуется ввод пароля, что может быть невозможно. Вы можете поиграть с /etc/sudoers, чтобы дать данному пользователю право на перезагрузку без пароля, но это некрасиво.
Вместо этого используйте reboot напрямую (для этого потребуется запустить основное приложение с правами root).
Для перезагрузки без пароля см. это
Для меня это не очень хорошая идея, потому что сторожевые таймеры обычно работают наоборот, сторожевые таймеры запускают перезагрузку, когда какое-то время нет сигнала от какого-то внешнего устройства. в вашем случае вам просто нужно вызвать перезагрузку, когда вы что-то получите, это не имеет большого значения.