Во встроенных системах часто используется сторожевой модуль.
Сторожевой таймер проверяет какое-либо местоположение (это может быть файл, может быть место в памяти и т. Д.) И перезапускает исследуемую систему, если это местоположение не соответствует критериям.
Таким образом, ваша программа может периодически проверять какой-либо файл programname_watchdog со штампом эпохи. Это будет частью обычного цикла.
Тогда ваш сторожевой таймер (в совершенно ином процессе) проверит файл. Если указанная дата была достаточно устаревшей, другая программа была бы убита и перезапущена, так как считалось, что она критически неисправна (зависла или потерпела крах). Обратите внимание, что ваш сторожевой таймер будет иметь простую логику, поэтому его шансы на сбой намного ниже
Я положительный есть и другие способы сделать это. Это только один из способов.
edit: Вы должны рассмотреть стек, на котором построена ваша система. Чем больше у вас внешних зависимостей, тем больше риск отказа. Вы также должны рассмотреть формальное доказательство правильности программы, если вы ищете идеальную работу.
Вопрос на самом деле становится тем, что вы ожидаете от своей системы; какие сбои недопустимы и какие сбои ожидаются, чтобы вы могли их компенсировать.
Этот вопрос становится проблемой совместного проектирования аппаратного и программного обеспечения очень быстро (и тоже дорого). Мне любопытно посмотреть, что вы делаете и каково ваше решение.