Quando usar reboot (2) vs reboot (8)

2

Estou escrevendo um programa reboot personalizado em C e tentando decidir se devo usar reboot(2) diretamente ou ligar para system("/sbin/reboot") .

O reboot(8) e o init 6 alteram o nível de execução e encerram os serviços normalmente e desmontam todos os sistemas de arquivos. Mas, reboot(2) não faz nada disso.

Quando reboot(2) deve ser usado de preferência para reboot(8) ?

(Eu sei da página man para chamar sync(2) antes de reboot(2) .)

    
por Cuadue 11.05.2015 / 23:00

3 respostas

2

Se você quiser reiniciar o sistema agora, não faça mais nada, não se preocupe com outros processos em execução, não se importe com arquivos abertos e chame a chamada de sistema reboot (por exemplo, reboot(2) ). Seria raro nem mesmo chamar sync .

Se você quiser reiniciar o sistema normalmente, deixando o processo algum tempo para sair corretamente, desmontando sistemas de arquivos, etc., chame o utilitário reboot (por exemplo, reboot(8) ).

Se precisar perguntar, o reboot(8) é o correto. A chamada do sistema reboot está lá apenas porque o utilitário reboot precisa ter alguma maneira de dizer "sim, eu terminei, o sistema está praticamente parado, agora restaure o processador".

    
por 12.05.2015 / 02:58
0

reboot(2) é uma API, você a usa se estiver implementando reboot(8) ou um sistema init.

Saiba mais lendo a página do manual .

    
por 11.05.2015 / 23:12
0

Você deve estar ciente de que reboot(8) pode ser reinicializado imediatamente (ignorando toda a interação com o init), executando-o como reboot -f . É assim que o init realmente desce o sistema depois de ser colocado no runlevel 6. A chamada reboot(2) é apenas como o reboot(8) interage com o kernel para dizer a ele para reinicializar fisicamente (ou desligar) o sistema. Ele também faz outras coisas, como colocar o processo init no controle de reagir ao pressionamento de tecla ctrl-alt-delete.

Em geral, a única razão pela qual você desejaria fazer reboot / halt / poweroff -f como usuário é se o sistema init estiver quebrado, por exemplo, se você estiver executando a recuperação manual do sistema no modo de usuário único (por exemplo, a linha de comando do kernel emergency ou init=/bin/sh ). E, claro, você precisa executar sync(8) antes de fazer isso.

Muitos inits fornecem um modo emergency ou rescue que não exige isso, em vez disso, você pode simplesmente usar as ferramentas normais de desligamento / reinicialização ou sair do shell. Os modos -f são, em geral, apenas para serem usados por usuários comuns como último recurso. Embora, certamente, se você ignorou o init completamente com init=/bin/sh , o sistema de desligamento comum provavelmente não fará nada útil. E se você sair do shell nesse caso, isso causará um pânico no kernel.

    
por 11.05.2015 / 23:20

Tags