我正在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 系统损坏,例如,如果您在单用户模式下进行手动系统恢复(例如使用内核命令启动)行emergency
或init=/bin/sh
)。当然,sync(8)
在执行此操作之前您需要先运行。
许多 init 确实提供了不需要此功能的emergency
or模式,您可以简单地使用正常的关闭/重新启动工具,或退出 shell。rescue
这些-f
模式通常仅供普通用户作为最后的手段使用。当然,如果您使用 完全绕过 init init=/bin/sh
,普通的关闭系统不可能做任何有用的事情。如果在这种情况下退出 shell,将会导致内核恐慌。
答案3
reboot(2)
是一个 API,如果您是,则可以使用它实施 reboot(8)
或初始化系统。
通过阅读了解更多手册页。