【发布时间】:2016-12-02 22:12:27
【问题描述】:
我正在包装一个 C 库,它执行一些可能会失败的 mallocs。 Rust 的其余部分在 OOM 上中止,所以我也想做同样的事情。有std::intrinsics::abort() 和core::intrinsics::abort()(有什么区别?),但它们都不稳定。
如何使用稳定的 Rust 中止()?
【问题讨论】:
我正在包装一个 C 库,它执行一些可能会失败的 mallocs。 Rust 的其余部分在 OOM 上中止,所以我也想做同样的事情。有std::intrinsics::abort() 和core::intrinsics::abort()(有什么区别?),但它们都不稳定。
如何使用稳定的 Rust 中止()?
【问题讨论】:
您可以拨打panic!()。
但是,如果可以拦截失败的分配,并以稳定的程序状态返回Rust,我认为最好报错(使用Result等)
【讨论】:
panic!() 是有原因的,因此我不想使用它。
panic! 是否中止整个进程,而不是单线程?
panic!() 的作用是可配置的。使用panic=abort 模式,它会立即终止整个进程。在panic=unwind 模式下,它的工作方式类似于 C++ 异常。
从 Rust 1.17.0 开始,您可以致电 std::process::abort()。
【讨论】:
由于 Rust 代码通常与定义了 abort 的 C 运行时库链接,因此您可以使用 extern 块导入该函数:
extern {
fn abort();
}
fn main() {
unsafe { abort(); }
}
请注意,这实际上与 abort 内在函数不同:abort() 函数引发 SIGABRT,而内在函数生成无效指令 (ud2),从而导致 SIGILL。
希望std::process::abort以后能稳定下来。
【讨论】: