私はCでカスタムreboot
プログラムを書いています。reboot(2)
system("/sbin/reboot")
どちらもランレベルをreboot(8)
変更しinit 6
てサービスを正常に終了し、すべてのファイルシステムをマウント解除します。しかし、reboot(2)
それは何もしません。
いつreboot(2)
最初に使うべきですかreboot(8)
?
(私はマニュアルページでsync(2)
以前に何を呼び出すべきかを知っていますreboot(2)
。)
答え1
今すぐシステムを再起動するには、他の操作を実行するのではなく、実行中の他のプロセスや開いているファイルに関係なく、システムコールreboot
(たとえば、reboot(2)
事前に電話をかけないこともほとんどありません)sync
。
システムを正常に再起動するには、プロセスが完全に終了するまで時間をかけてファイルシステムをアンマウントし、ユーティリティreboot
(たとえばreboot(8)
)を呼び出します。
ぜひ尋ねなければならないなら、reboot(8)
そうです。システムコールは、ユーティリティが「はい、終了しました。システムがほぼ停止しました。プロセッサをリセットします」と言う方法が必要なために作成reboot
されます。reboot
答え2
reboot(8)
すぐに再起動として実行すると、すぐに再起動できることを知っておく必要があります(initとのすべての対話をスキップ)reboot -f
。これは、initがランレベル6に入った後に実際にシステムをシャットダウンする方法です。この呼び出しは、カーネルと対話してシステムを物理的に再起動(またはシャットダウン)するように指示するreboot(2)
だけです。reboot(8)
また、ctrl-alt-delete キーストロークに対する init プロセス制御応答を許可するなど、他の操作も実行します。
通常、ユーザーとして再起動/停止/電源オフ -fを実行する唯一の理由は、initシステムが破損していることです。たとえば、シングルユーザーモードで手動システムリカバリ(ブートなど)を実行する場合です。カーネルコマンドラインemergency
またはinit=/bin/sh
)を使用してください。もちろん、sync(8)
これを行う前に実行する必要があります。
多くの初期化では、この機能を必要としないモードが提供されるため、通常のシャットダウンemergency
/再開機能を使用したり、シェルを終了したりできます。rescue
これらの-f
モードは通常、一般ユーザーが最後の手段としてのみ使用します。もちろん、initを使用して完全に迂回している場合、init=/bin/sh
システムを正常にシャットダウンしても役に立ちません。この状況でシェルを終了すると、カーネルパニックが発生します。
答え3
reboot(2)
APIなので、次の場合に使用できます。実装する reboot(8)
またはシステムを初期化してください。
読んでさらに詳しくマニュアルページ。