下面的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应该只在我们的自定义处理程序之后运行。因此,它不应该恐慌。
答案 0 :(得分:7)
你混淆了你调用的libc::atexit
和你的链接指向的sys_common::at_exit
(在src / libstd / sys / common / mod.rs中)以及Rust在早期调用的内容清理。
这是两个不同的清理队列,我不想依赖它们按特定顺序执行。