【问题标题】:Safe reboot linux in C在 C 中安全重启 linux
【发布时间】:2015-12-07 12:28:30
【问题描述】:

如何在没有 exec 的情况下从 C 中安全地重新启动,如 shell 命令 reboot? reboot.h 中的重启功能并不安全。它没有同步,也可能没有卸载和安全的进程终止。什么函数有魔法参数?

打赌

【问题讨论】:

  • 我赌“很多”或“种类”。
  • 确实知道 Linux 中的所有系统命令都是开源的,并且有可供任何人学习的源代码吗?这意味着您可以找出 reboot 命令来自哪个包,找到源并查看它的确切作用。
  • 为什么要在没有exec的情况下重启?

标签: c linux api reboot


【解决方案1】:

最简单的方法:

system('reboot')

否则,你有Linux: Programatically shutdown or reboot computer from a user-level process

【讨论】:

    【解决方案2】:

    事实上,有些系统在重新启动时没有正确卸载分区,从而导致文件系统错误。例如,Android 只是强制 文件系统以只读方式挂载(通过 sysrq-triggerissuing "u" 命令)。如果您不关注性能,而是希望系统干净利落地关闭,而不是快速关闭,那么您需要执行以下步骤:

    • 停止主循环init。没有单一的方法可以做到这一点,这取决于您的系统正在使用的 init 实现。您需要停止主 init 循环,因为您不希望 init 重新启动您将在下一步中开始杀死的进程。
    • 向所有进程发出“停止”信号,让它们完成操作
    • 如果“停止”时间过长,则向所有进程发出“终止”信号。您不希望在卸载之前有打开文件的进程。
    • 将所有分区卸载为只读
    • 通过发出 reboot 标准调用请求内核关闭机器。

    您可以使用 C 代码执行上述所有步骤,使用 killumountreboot 等调用。

    正如我之前所说,Android 不是干净关机的最佳示例,但您可以查看示例 C 代码关机实现 here

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 2012-06-27
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多