如何中止 Rust 进程?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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以后能稳定下来。

【讨论】:

以上是关于如何中止 Rust 进程?的主要内容,如果未能解决你的问题,请参考以下文章

中止时如何使用 SIGINT 而不是 SIGTERM 终止 Jenkins 作业中的 psql 进程?

在 Rust 中写入子进程的标准输入?

Django-使用内联函数时进程中止

无法中止进程无法访问操作拒绝访问

Rust 编译错误:进程没有成功退出

MySQL无法启动mysql服务(位于本地计算机上)错误1067,进程意外中止