【问题标题】:How to cleanly end the program with an exit code?如何用退出代码干净地结束程序?
【发布时间】:2015-07-28 15:51:46
【问题描述】:

在 Rust 1.0 中有没有返回退出代码的方法?

我尝试过env::set_exit_status(exit_code);,但这会产生编译器错误。

还有这个问题:Exit Rust program early 类似,但询问必须提前退出进程的情况。


编辑:我正在寻找一种解决方案,该解决方案还允许进程整理堆栈、调用析构函数等。

【问题讨论】:

  • @static_rtti 你能进一步解释一下Levans' answer 的哪一部分不合适吗? 肯定是一种系统编程语言...记住,Rust 也可以在没有启动器进程的环境中使用(如内核)。
  • 我读得不够好,听起来像我想要的。

标签: rust


【解决方案1】:

@FrancisGagné 's answer 的 cmets 上构建,如果你正在寻找 C 的 return exit_code 的等价物,你可以这样人工构建它:

fn main() {
    let exit_code = real_main();
    std::process::exit(exit_code);
}

fn real_main() -> i32 {
    // the real program here
}

这样,您程序的所有对象都将在real_main() 函数的范围内,并且您可以在main 中安全地使用return exit_code;,同时仍然让所有析构函数正常运行。

【讨论】:

    【解决方案2】:

    从 Rust 1.26 开始,main 函数不再局限于 ()main 还可以为任何类型的 E: Debug 返回一个 Result<(), E>Ok 值映射到 EXIT_SUCCESS(在所有平台上恰好为 0),Err 值映射到 EXIT_FAILURE(在所有平台上恰好为 1)。错误值也会自动打印到标准错误流中。

    在未来,Rust 将支持更多 main 的返回类型。 Termination trait(从 Rust 1.31.1 开始不稳定)定义了所有这些类型。该特征的工作是将值转换为i32 退出代码。当Termination 稳定后,应用程序自然能够自己实现该特征以提供自己的结果类型。

    【讨论】:

      【解决方案3】:

      std::process::exit 以指定的退出代码退出程序。

      【讨论】:

      • 不幸的是,它没有清理并调用析构函数。我将修改问题以提及这一点。
      • 您需要清理的任何原因?你有做“有趣”事情的析构函数吗?如果没有,那么让操作系统清理进程通常就足够了。
      • 我想我正在寻找 C 中 return exit_code; 的直接替代品。如果可能的话,我想避免不刷新到磁盘等的可能性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2014-07-24
      • 2013-01-28
      相关资源
      最近更新 更多