5

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

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

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

4

1 回答 1

8

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

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

于 2016-03-14T08:01:21.557 回答