何时使用重新启动(2) 与重新启动(8)

何时使用重新启动(2) 与重新启动(8)

我正在reboot用 C 编写一个自定义程序,并尝试决定是否应该直接使用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)与内核交互以告诉它物理重新启动(或关闭)系统的方式。它还执行其他操作,例如让 init 进程控制对 ctrl-alt-delete 击键的反应。

一般来说,您想要以用户身份执行reboot/halt/poweroff -f 的唯一原因是 init 系统损坏,例如,如果您在单用户模式下进行手动系统恢复(例如使用内核命令启动)行emergencyinit=/bin/sh)。当然,sync(8)在执行此操作之前您需要先运行。

许多 init 确实提供了不需要此功能的emergencyor模式,您可以简单地使用正常的关闭/重新启动工具,或退出 shell。rescue这些-f模式通常仅供普通用户作为最后的手段使用。当然,如果您使用 完全绕过 init init=/bin/sh,普通的关闭系统不可能做任何有用的事情。如果在这种情况下退出 shell,将会导致内核恐慌。

答案3

reboot(2)是一个 API,如果您是,则可以使用它实施 reboot(8)或初始化系统。

通过阅读了解更多手册页

相关内容