下面的Rust程序在 atexit
处理程序中访问 stdout
时会发生混乱 .
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 回答
您混淆了
libc::atexit
,您调用它,以及sys_common::at_exit
(在src / libstd / sys / common / mod.rs中)您的链接指向哪个以及Rust在早期清理期间调用的内容 .这是两个不同的清理队列,我不想依赖它们按特定顺序执行 .