Estou implementando uma chamada de reinicialização () no meu aplicativo. É um aplicativo incorporado, portanto, nenhum console, teclado ou chave liga / desliga. A reinicialização () deve, eventualmente, reiniciar o sistema, não importa o quê. Idealmente, eu quero que ele falhe graciosamente.
Já tive sistemas no passado causando problemas onde uma chamada para reboot
ou shutdown
não resultou em uma reinicialização da máquina. por exemplo. Falha ao sincronizar unidades, desmontar uma unidade flash USB removida.
Meu sistema é incorporado, com um sistema de arquivamento raiz montado somente para leitura, portanto, um desligamento repentino não é um grande problema. Mas eu escrevo logs para um disco Flash e gostaria de preservar isso o máximo possível.
Meu Reboot atual () se parece com isto:
void Reboot()
{
system( "reboot" ); // try the reboot
sleep(2);
system( "reboot -f" ); // force
sleep(2);
system( "reboot -f -n" ); // force and don't try to sync
sleep(2);
system( "kill 1" ); // process 1 is the root process of all
sleep(2);
Reset();
}
O comando reset é uma reinicialização do sistema que não irá falhar. O sistema também tem um temporizador de Watchdog.
As pessoas gostariam de comentar sobre qualquer coisa para adicionar / substituir / alterar na minha função Reboot ()?
por exemplo. devo usar o Magic SysRq ?