【问题标题】:How do I abort a Rust process?如何中止 Rust 进程?
【发布时间】:2016-12-02 22:12:27
【问题描述】:

我正在包装一个 C 库,它执行一些可能会失败的 mallocs。 Rust 的其余部分在 OOM 上中止,所以我也想做同样的事情。有std::intrinsics::abort()core::intrinsics::abort()(有什么区别?),但它们都不稳定。

如何使用稳定的 Rust 中止()?

【问题讨论】:

    标签: rust ffi abort


    【解决方案1】:

    您可以拨打panic!()

    但是,如果可以拦截失败的分配,并以稳定的程序状态返回Rust,我认为最好报错(使用Result等)

    【讨论】:

    • 我认为标准 Rust 代码在 OOM 上没有 panic!() 是有原因的,因此我不想使用它。
    • @Timmmm 那是因为 Rust 假设展开将分配内存,并且 OOM 意味着没有其他东西可以分配。我个人认为是too pessimistic and causes problems
    • panic! 是否中止整个进程,而不是单线程?
    • panic!() 的作用是可配置的。使用panic=abort 模式,它会立即终止整个进程。在panic=unwind 模式下,它的工作方式类似于 C++ 异常。
    【解决方案2】:

    从 Rust 1.17.0 开始,您可以致电 std::process::abort()

    【讨论】:

      【解决方案3】:

      由于 Rust 代码通常与定义了 abort 的 C 运行时库链接,因此您可以使用 extern 块导入该函数:

      extern {
          fn abort();
      }
      
      fn main() {
          unsafe { abort(); }
      }
      

      请注意,这实际上与 abort 内在函数不同:abort() 函数引发 SIGABRT,而内在函数生成无效指令 (ud2),从而导致 SIGILL

      希望std::process::abort以后能稳定下来。

      【讨论】:

        猜你喜欢
        • 2021-11-07
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 2018-01-07
        • 2020-01-16
        • 2010-11-26
        相关资源
        最近更新 更多