为什么atexit处理程序在访问stdout时会感到恐慌?

时间:2016-03-14 05:29:15

标签: rust atexit

下面的Rust程序在访问stdout处理程序中的atexit时会发生恐慌。

extern crate libc;

extern "C" fn bye() {
    println!("bye");
}

fn main() {
    println!("hello");
    unsafe { libc::atexit(bye) };
}

输出:

hello
thread '<main>' panicked at 'cannot access stdout during shutdown', ../src/libcore/option.rs:298
fatal runtime error: Could not unwind stack, error = 5
An unknown error occurred

在我看来,this registration应该在atexit注册之前运行,因此处理程序中的this line应该只在我们的自定义处理程序之后运行。因此,它不应该恐慌。

1 个答案:

答案 0 :(得分:7)

你混淆了你调用的libc::atexit和你的链接指向的sys_common::at_exit(在src / libstd / sys / common / mod.rs中)以及Rust在早期调用的内容清理。

这是两个不同的清理队列,我不想依赖它们按特定顺序执行。